Я в основном использую Python, но я играю с Go. Я написал следующее, чтобы сделать что-то, что довольно просто в python, и я надеюсь, что это может быть достигнуто и в Go.использовать gob для упаковки рекурсивно определенных структур
package main
import (
"bytes"
"encoding/gob"
"fmt"
"io/ioutil"
)
type Order struct {
Text string
User *User
}
type User struct {
Text string
Order *Order
}
func main() {
o := Order{}
u := User{}
o.Text = "order text"
u.Text = "user text"
// commenting this section prevents stack overflow
o.User = &u
u.Order = &o
fmt.Println("o.u.text:", o.User.Text, "u.o.text:", u.Order.Text)
// end section
m := new(bytes.Buffer)
enc := gob.NewEncoder(m)
enc.Encode(o)
err := ioutil.WriteFile("gob_data", m.Bytes(), 0600)
if err != nil {
panic(err)
}
fmt.Printf("just saved gob with %v\n", o)
n, err := ioutil.ReadFile("gob_data")
if err != nil {
fmt.Printf("cannot read file")
panic(err)
}
p := bytes.NewBuffer(n)
dec := gob.NewDecoder(p)
e := Order{}
err = dec.Decode(&e)
if err != nil {
fmt.Printf("cannot decode")
panic(err)
}
fmt.Printf("just read gob from file and it's showing: %v\n", e)
}
Как вы можете видеть, существуют две настраиваемые структуры, каждая из которых содержит ссылку на другую, рекурсивно. Когда я пытаюсь упаковать один файл в файл с помощью gob, он компилируется, но я получаю переполнение стека, я предполагаю, что это вызвано рекурсией. По моему опыту, маринование обрабатывает такие вещи без вздоха. Что я делаю не так?
ОБНОВЛЕНИЕ: для тех, кто идет после. Я нашел библиотеку, которая делает это. Он не поддерживается, но он работает. https://github.com/lowentropy/go-lager – domoarrigato