나는 현재 연습 중 하나를 문제로 이동 랭 튜토리얼 작업 만 실행 해요 :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
내가 이동에서 원하는 것을 달성 할 수있는 방법이 있나요?
{...}'이 아니라 'func init (...) {...}'? (후자는 컴파일러 오류가 발생합니다) – jlhawn
init은 main과 같은 매개 변수를 허용하지 않습니다. – zk82
http://golang.org/ref/spec는 프로그램의 모든 곳에서 init 함수 (패키지 수준의 func init())를 참조 할 수 없음을 지정합니다. – zk82