Şu anda egzersizleri biriyle sorun haline Git Lang öğretici üzerinde çalışıyor, ama ran ediyorum:Go'da Statik Başlatma?
https://tour.golang.org/methods/23
egzersiz beni ROT13 şifre uygulamak gelmiştir. Bir bayttan döndürülmüş değere bir harita kullanarak şifreyi uygulamaya karar verdim, ancak bu haritayı başlatmanın en iyi yolundan emin değilim. Bir literal kullanarak haritayı başlatmak istemiyorum, ancak bir alfabeyle ve döngü içindeki ayar (anahtar, değer) çiftleriyle döngü yaparak programlı olarak yapmayı tercih ediyorum. Ayrıca haritanın sadece Rot13Reader struct/object'ten erişilebilir olmasını ve tüm örneklerin (?) Aynı haritayı paylaştığını (aynı zamanda her bir Rot13Reader için bir kopya yerine) olmasını isterim.
İşte benim şimdiki çalışma Git program:
İştepackage 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)
}
sorunlar Bununla var şunlardır: Ben main()
rot13Map
hazırlamak zorunda kalmak istemiyoruz
- Küresel kapsamda olmak
rot13Map
istiyorum. - Ben
rot13Reader
her kopyası olmasını istemiyoruz ayrırot13Map
Ben git istediğini elde etmek için bir yol var mı?
{...} 'değil func init (...) {...} '? (ikincisi bir derleyici hatasına neden olur) – jlhawn
Init, ana gibi parametrelere izin vermez sanırım. – zk82
http://golang.org/ref/spec, bir init işlevinin (paket düzeyinde func init()) bir programdaki her yerden gönderilemeyeceğini belirtir. – zk82