Im Moment arbeite ich auf dem Tutorial Go Lang, sondern lief in Problem mit einem der Übungen:Statische Initialisierung in Go?
https://tour.golang.org/methods/23
Die Übung mir eine ROT13 Chiffre umzusetzen hat. Ich beschloss, die Chiffre mit einer Karte von einem Byte zu seinem gedrehten Wert zu implementieren, aber ich bin mir nicht sicher, wie diese Karte am besten initialisiert werden kann. Ich möchte die Map nicht mit einem Literal initialisieren, sondern würde es lieber programmatisch machen, indem ich ein Alphabet durchbohre und Paare (Schlüssel, Wert) innerhalb der Schleife setze. Ich möchte auch, dass die Map nur von Rot13Reader struct/object aus zugänglich ist und dass alle Instanzen (?) Dieselbe Map teilen (statt einer Kopie pro Rot13Reader).
Hier ist meine aktuelle Arbeits Go Programm:
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)
}
Hier sind die Probleme, die ich mit diesem haben:
- Ich will nicht
rot13Map
vorzubereiten haben inmain()
- I don möchte nicht
rot13Map
in globalen Geltungsbereich sein. - Ich möchte nicht jede Kopie eines
rot13Reader
ein separates in Gorot13Map
Gibt es eine Möglichkeit zu erreichen, was ich will haben?
Auf einer etwas verwandten beachten Sie, warum muss ich meine verschachtelte Funktion in 'main' als' var init = func (...) {...} 'und nicht definieren 'func init (...) {...}'? (Letzteres verursacht einen Compiler-Fehler) – jlhawn
Ich denke, die Init erlaubt keine Parameter, wie Main. – zk82
http://golang.org/ref/spec gibt an, dass auf eine init-Funktion (func init() auf Paketebene) nicht von überall in einem Programm zugegriffen werden kann. – zk82