我目前正在编写 Go Lang 教程,但在其中一个练习中遇到了问题:
https://tour.golang.org/methods/23
这个练习让我实现了一个 ROT13 密码。我决定使用从字节到其旋转值的映射来实现密码,但我不确定初始化此映射的最佳方法。我不想使用文字来初始化地图,但更愿意通过循环遍历字母并在循环中设置(键,值)对来以编程方式进行。我还希望地图只能从 Rot13Reader 结构/对象访问,并且所有实例(?)共享同一个地图(而不是每个 Rot13Reader 一个副本)。
这是我目前正在运行的 Go 程序:
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)
}
以下是我遇到的问题:
- 我不想
rot13Map
准备main()
- 我不想
rot13Map
在全球范围内。 - 我不希望 a 的每个副本
rot13Reader
都有一个单独的rot13Map
有没有办法在 Go 中实现我想要的?