私は現在、ゴーラングのチュートリアルに取り組んが、演習のいずれかに問題に遭遇したよ:運動は私がROT13暗号を実装していGoでの静的初期化?
https://tour.golang.org/methods/23
。私はバイトからその回転値までのマップを使って暗号を実装することにしましたが、このマップを初期化する最良の方法は不明です。リテラルを使用してマップを初期化したくないのですが、アルファベットをループし、ループ内で(キー、値)のペアを設定することによってプログラムで行う方が好きです。また、Rot13Readerのstruct/objectからしかアクセスできないすべてのインスタンス(?)が(Rot13Readerごとに1つのコピーではなく)同じマップを共有するようにしたいと思います。
は、ここに私の現在の作業囲碁プログラムです:
ここ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
私は行くに欲しいものを達成するための方法はありますか?
ありません'func init(...){...}'? (後者はコンパイラエラーを引き起こします) – jlhawn
initはmainのようなパラメータを許可していないと思います。 – zk82
http://golang.org/ref/specは、プログラム内のどこからでもinit関数(パッケージレベルでのfunc init())を参照できないことを指定しています。 – zk82