2014-11-12 3 views
2

Я в основном использую 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, он компилируется, но я получаю переполнение стека, я предполагаю, что это вызвано рекурсией. По моему опыту, маринование обрабатывает такие вещи без вздоха. Что я делаю не так?

+0

ОБНОВЛЕНИЕ: для тех, кто идет после. Я нашел библиотеку, которая делает это. Он не поддерживается, но он работает. https://github.com/lowentropy/go-lager – domoarrigato

ответ

4

В настоящее время, encoding/gob пакета doesn't work с рекурсивными значениями:

рекурсивных типов работают нормально, но рекурсивные значения (данные с циклами) являются проблематичными. Это может измениться.

Пока это не изменится, вам придется либо не использовать циклические данные, либо использовать другой подход к сериализации.

+1

Boo ... Спасибо за информацию, хотя, я надеюсь, они в конечном итоге будут поддерживаться. Полюбите его в python для захвата внутреннего состояния. – domoarrigato

Смежные вопросы