我目前正在学习Go Lang教程,但在其中一个练习中遇到了问题:

https://tour.golang.org/methods/23

这个练习让我实现了一个ROT13密码.我决定使用从字节到其旋转值的映射来实现密码,但我不确定初始化该映射的最佳方法.我不想使用文字来初始化映射,但更愿意通过编程方式通过循环遍历字母表和循环中的设置(键、值)对来初始化映射.我还希望映射只能从Rot13Reader struct /对象访问,并且具有所有实例(?)共享同一张 map (而不是每个Rot13Reader一份).

以下是我目前的工作围棋计划:

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

var rot13Map = map[byte]byte{}

func (rotr *rot13Reader) Read(p []byte) (int, error) {
    n, err := rotr.r.Read(p)
    for i := 0; i < n; i++ {
        if sub := rot13Map[p[i]]; sub != byte(0) {
            p[i] = sub
        }
    }
    return n, err
}

func main() {
    func() {
        var uppers = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        var lowers = []byte("abcdefghijklmnopqrstuvwxyz")

        var init = func (alphabet []byte) {
            for i, char := range alphabet {
                rot13_i := (i + 13) % 26
                rot13Map[char] = alphabet[rot13_i]
            }
        }

        init(uppers)
        init(lowers)
    }()

    s := strings.NewReader("Lbh penpxrq gur pbqr!")
    r := rot13Reader{s}
    io.Copy(os.Stdout, &r)
}

以下是我在这方面遇到的问题:

  • 我不想在main()课上准备rot13Map
  • 我不想让rot13Map在全局.
  • 我不想让每一张rot13Reader都有一个单独的rot13Map

有没有办法实现我在围棋中的目标?

推荐答案

为了做到这一点,我会制作一个rot13包.可以通过编程方式在init()函数中创建映射,并将其作为包级全局提供给所有rot13解码器.导入包时,init函数将运行.

因为Rot13Reader是包中的唯一类型,所以它也是唯一能够访问 map 的类型.

警告:所有代码都未经测试.

package rot13

import (
    "io"
)

var rot13Map = map[byte]byte{}

func init() {
    var uppers = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    var lowers = []byte("abcdefghijklmnopqrstuvwxyz")

    var init = func(alphabet []byte) {
        for i, char := range alphabet {
            rot13_i := (i + 13) % 26
            rot13Map[char] = alphabet[rot13_i]
        }
    }

    init(uppers)
    init(lowers)
}

type Reader struct {
    r io.Reader
}

func (rotr Reader) Read(p []byte) (int, error) {
    n, err := rotr.r.Read(p)
    for i := 0; i < n; i++ {
        if sub := rot13Map[p[i]]; sub != byte(0) {
            p[i] = sub
        }
    }
    return n, err
}

显然,你不能在围棋巡回赛中再做一个套餐了.您被Main可以访问的rot13Map所困.您需要运行GO LOCAL来获得您想要的分离.

Go相关问答推荐

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

按键值排序字符串- Golang

更改位置级别和时间戳零点Golang

GoLang:无法发送带有附件的邮箱

ChromeDriver不存在(高朗selenium)

需要类型[]*structpb.Value(GCP Golang客户端库;aiPlatform)

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

如何使用 Go 连接到非默认 firestore 数据库?

从带有嵌套括号的字符串中提取值

将这两个函数合二为一的惯用方法

是否可以使用标准库构建 Go 二进制文件?

Go 中的 protobuf FieldMask 解组

为什么我只收到部分错误而不是我启动的 goroutines 的所有错误?

杜松子wine 和中间件

通过多阶段构建复制到 Docker 容器中时找不到文件

GitHub 中 REST API 的 aws 凭证问题

Neptune 在连接到启用 IAM 的 Neptune 实例时抛出握手错误错误

Golang Echo Labstack 如何在模板视图中调用函数/方法

Golang 使用 docker 将敏感数据作为参数传递

Grafana/Prometheus 将多个 ip 可视化为查询