我目前工作的圍棋郎教程,但是遇到了問題的一個練習: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