我目前正在学习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
有没有办法实现我在围棋中的目标?