Как сохранить или закодировать связанную структуру данных в Go?

Моя цель состоит в том, чтобы иметь связанную структуру данных, то есть структуру со ссылкой на другую структуру и т. Д., Чтобы я мог кодировать ее в свою файловую систему, и всякий раз, когда мне это нужно, декодировать ее, чтобы восстановить все связанная структура, с тем же содержанием.

Пример:

У меня есть эти связанные структуры:

type A struct {
    b *B
}

type B struct {
    c []C
}

type C interface{}

Я инициализирую их так:

var c0 C = "foo"
var c1 C = "bar"

var b *B = &B{}
b.c = make([]C, 2)
b.c[0] = c0
b.c[1] = c1

var a A = A{}
a.b = b

fmt.Println(a)
// {$b_address}

fmt.Println(a.b)
// {[c0_address,c1_address]}

fmt.Println(a.b.c[0])
// foo

fmt.Println(a.b.c[1])
// bar

Я хотел бы знать, как кодировать A, сохраняя его в файл, чтобы я мог декодировать его, получая тот же результат. Адреса не важны, но содержание есть. Я попробовал это с encoding/gobбезуспешно:

// encode
f, err := os.Create("data.gob")

if err != nil {
    fmt.Println(err)
    os.Exit(1)
}

enc := gob.NewEncoder(f)
enc.Encode(a)

f.Close()

// decode

var a1 A
f, err = os.Open("data.gob")

if err != nil {
    fmt.Println(1, err)
    os.Exit(1)
}

dec := gob.NewDecoder(f)
dec.Decode(&a1)
if err != nil {
    fmt.Println(2, err)
    os.Exit(1)
}
f.Close()

fmt.Println(a1)
// {<nil>}
// expected {$b_address}

Полный пример: http://play.golang.org/p/2vxHR9BzNy

Есть ли способ сделать это без обнародования полей? Есть ли какое-либо существующее решение, поэтому мне не нужно изобретать велосипед?

2 ответа

Есть ли способ сделать это без обнародования полей? Есть ли какое-либо существующее решение, поэтому мне не нужно изобретать велосипед?

Если вы не готовы сделать это путем копирования всех ваших данных в типы с экспортируемыми полями при кодировании и из них при декодировании, нет.

Если данные не экспортируются, другие пакеты просто не могут их увидеть. Вот почему их называют неэкспортированными. Пакеты как encoding/json, encoding/xml, а также encoding/gob работать только с экспортированными данными именно по этой причине.

Поля должны быть экспортированы. Пакеты, которые выполняют кодирование / сериализацию и т. Д., Не видят полей в противном случае. Пока ваши поля экспортируются любой из encoding/ пакеты будут делать то, что вы хотите по умолчанию.

Другие вопросы по тегам