我目前工作的围棋郎教程,但是遇到了问题的一个练习:Go中的静态初始化?
https://tour.golang.org/methods/23
的行使,我实现一个ROT13加密。我决定使用从字节到其旋转值的映射来实现密码,但我不确定初始化此映射的最佳方式。我不想使用文字来初始化地图,但宁愿以编程方式通过循环字母表并在循环中设置(键,值)对来完成。我还希望地图只能从Rot13Reader结构/对象访问,并让所有实例(?)共享相同的地图(而不是每个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
有没有办法达到我想要进去吗?
在一个有点相关的说明,为什么我要在'main'来定义我的嵌套函数为'无功的init = FUNC(...){...}',而不是'func init(...){...}'? (后者导致编译器错误) – jlhawn 2013-05-05 01:58:31
我猜init不允许像main一样的参数。 – zk82 2013-05-06 06:32:21
http://golang.org/ref/spec指定一个init函数(程序包级别的func init())不能从程序中的任何地方引用。 – zk82 2013-05-06 08:53:58