che sto attualmente lavorando il tutorial Go Lang, ma ha incontrato un problema con uno degli esercizi:Inizializzazione statica in Go?
https://tour.golang.org/methods/23
L'esercizio mi ha implementare un cifrario ROT13. Ho deciso di implementare il codice utilizzando una mappa da un byte al suo valore ruotato, ma non sono sicuro del modo migliore per inizializzare questa mappa. Non voglio inizializzare la mappa usando un letterale, ma preferirei farlo a livello di programmazione passando da un alfabeto e impostando coppie (chiave, valore) all'interno del ciclo. Mi piacerebbe anche che la mappa fosse accessibile solo dalla struttura/oggetto Rot13Reader e che tutte le istanze (?) Condividessero la stessa mappa (piuttosto che una copia per Rot13Reader).
Ecco il mio attuale lavoro programma di Go:
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)
}
Qui sono i problemi che ho con questo:
- Io non voglio avere a preparare
rot13Map
inmain()
- I don Non voglio che
rot13Map
sia nello scope globale. - non voglio ogni copia di un
rot13Reader
di avere un separatorot13Map
C'è un modo per ottenere quello che voglio in Go?
In una nota correlata in qualche modo, perché devo definire la mia funzione annidata in 'main' come' var init = func (...) {...} 'e non 'func init (...) {...}'? (quest'ultimo causa un errore del compilatore) – jlhawn
Suppongo che init non permetta parametri, come main. – zk82
http://golang.org/ref/spec specifica che una funzione di inizializzazione (func init() a livello di pacchetto) non può essere indirizzata da ovunque in un programma. – zk82