# Вопрос по golang
Andrew Lobanov(tavern,1) — All
2017-09-15 09:49:01


Есть затея сохранять слайс из структур в файл:

package main

import (
    "encoding/gob"
    "os"
    "fmt"
)

type count struct {
    echo string
    count int
}

func main() {
    d := []count{{"bash.rss", 100}, {"pipe.2032", 200}}
    fmt.Println(d)
    f, _ := os.Create("slice")
    encoder := gob.NewEncoder(f)
    encoder.Encode(d)
    f.Close()
}

Файл вполне себе создаётся.

А вот считать из этого файла у меня не выходит:

package main

import (
    "os"
    "encoding/gob"
    "fmt"
)

type count struct {
    echo string
    count int
}

func main() {
    d := []count{}
    f, _ := os.Open("slice")
    encoder := gob.NewDecoder(f)
    _ = encoder.Decode(d)
    fmt.Println(d)
    f.Close()
}

В итоге в d после декодирования вижу пустой слайс. Что я делаю не так?

# Re: Вопрос по golang
Difrex(mira, 14) — Difrex
2017-09-15 14:05:49


Не прочитал код сначала =)

Игнорируй пост про жсон

# Re: Вопрос по golang
Difrex(mira, 14) — Andrew Lobanov
2017-09-15 13:53:50


Сделай так
type count struct {
    echo string `json:"echo"`
    count int `json:"count"`
}

Потом маршаль его и пиши в файл json. После считывания анмаршал делай.

var c []count
err := json.Unmarshal(data, &c)

# Re: Вопрос по golang
Difrex(mira, 14) — Andrew Lobanov
2017-09-15 14:04:45


Тут ссылку нужно передать
_ = encoder.Decode(&d)

# Re: Вопрос по golang
Difrex(mira, 14) — Difrex
2017-09-15 15:55:49


Ну и ошибку лучше обрабатывать все же.

# Re: Вопрос по golang
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:00


Difrex> Потом маршаль его и пиши в файл json. После считывания анмаршал делай.

json у меня как крайний вариант.

# Re: Вопрос по golang
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:00


Difrex> Тут ссылку нужно передать
Difrex> _ = encoder.Decode(&d)

Да. Я там нагуглил потом. Но один фиг пустой слайс на выходе.

# Re: Вопрос по golang
Andrew Lobanov(tavern,1) — Difrex
2017-09-16 12:33:01


Difrex> Ну и ошибку лучше обрабатывать все же.

Это тестовый пример. В ошибку попадает EOF, так что заведомо всё нормально. Вот поему слайс пустой я не пойму.

# Re: Вопрос по golang
Difrex(mobile)(tavern,23) — Andrew Lobanov
2017-09-16 12:50:17


А какая версия го?

Вечером попробую у себя воспроизвести.

ЗЫ: приехал в Москву. Отвык я уже от метро 😀

# Re: Вопрос по golang
Andrew Lobanov(tavern,1) — Difrex(mobile)
2017-09-16 15:12:36


Difrex(mobile)> А какая версия го?

1.9

Difrex(mobile)> Вечером попробую у себя воспроизвести.

Буду признателен.

Difrex(mobile)> ЗЫ: приехал в Москву. Отвык я уже от метро.

А я ни разу на метро не ездил. В Екатеринбурге, когда ездил на курсы по MS SQL Server, на нём можно было доехать от вокзала до гостинницы и обратно, но я предпочёл лишний ачсок пешком прогуляться.

# Re: Вопрос по golang
Difrex(mobile)(tavern,23) — Andrew Lobanov
2017-09-16 18:10:37


Тут пешочком не прогуляться. Мне от дома до дома родителей час на машине ехать. Вот еду обратно в метро. Метро быстро!

# Re: Вопрос по golang
Difrex(mira, 14) — Difrex
2017-09-16 21:27:33


Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

# Re: Вопрос по golang
Difrex(mira, 14) — Andrew Lobanov
2017-09-16 21:25:58


Вот так вот работает все
package main

import (
	"encoding/gob"
	"fmt"
	"os"
)

type Count struct {
	Echo  string
	Count int
}

func main() {
	d := []Count{{"eee", 1}}
	f, _ := os.Create("slice")
	enc := gob.NewEncoder(f)
	enc.Encode(d)
	f.Close()

	var c []Count
	s, _ := os.Open("slice")
	dec := gob.NewDecoder(s)
	dec.Decode(&c)
	defer s.Close()
	fmt.Println(c)
}

go build
./test 
[{eee 1}]


# Re: Вопрос по golang
Andrew Lobanov(tavern,1) — Difrex
2017-09-17 08:59:07


Difrex> Чтобы считать из файла структура и поля у нее должны быть экспортированы https://blog.golang.org/gobs-of-data

Да. Дело оказалось именно в этом. Спасибо за помощь.