В настоящее время я работаю над учебником Go Lang, но столкнулся с проблемой с одним из упражнений:
https://tour.golang.org/methods/23
В упражнении я использую шифр ROT13. Я решил реализовать шифр, используя карту от байт до ее повернутого значения, но я не уверен в том, что вы сможете инициализировать эту карту. Я не хочу инициализировать карту, используя литерал, но предпочел бы делать это программно, перейдя через алфавит и установив пары (ключ, значение) в цикле. Мне также хотелось бы, чтобы карта была доступна только из структуры/объекта Rot13Reader и имела все экземпляры (?) Совместно использовать одну и ту же карту (а не одну копию на Rot13Reader).
Здесь моя текущая работающая программа 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)
}
Вот проблемы, которые у меня есть с этим:
- Я не хочу готовить
rot13Map
вmain()
- Я не хочу, чтобы
rot13Map
находился в глобальной области. - Я не хочу, чтобы каждая копия
rot13Reader
имела отдельныйrot13Map
Есть ли способ достичь того, что я хочу в Go?