LINUX.ORG.RU

Golang запись слайса в файл

 


0

1

Приветствую уважаемых форумчан. Ковыряю Go потихоньку, и столкнулся со следующей проблемой. Есть слайс содержащий около 300 к строк. Надо его сохранить в файл. Делаю это следующим образом:

func buildData(filename string, data []string) {
	buf := &bytes.Buffer{}
	gob.NewEncoder(buf).Encode(data[0:])
	bs := buf.Bytes()
	err := ioutil.WriteFile(filename, bs, 0644)
	if err != nil {
		panic(err.Error())
	}
}
Отрабатывает быстро, всё сохраняет..Но, перед первой строкой добавляет кучу мусорных символов. Собственно вопрос в том, как просто и быстро сохранить строки слайса в файл, без мусора? Спасибо.

Ответ на: комментарий от beastie

Опа. Спасибо!

В результате сделал так:

func buildData(filename string, data []string) {
	s := strings.Join(data[0:], "")
	err := ioutil.WriteFile(filename, []byte(s), 0644)
	if err != nil {
		panic(err.Error())
	}
}

CynicRus
() автор топика
Ответ на: комментарий от redixin

1. Make it work

2. Make it right

3. Make it fast (and eat less memory)

anonymous
()
Ответ на: комментарий от gadzira

А что не так?

func buildData(filename string, data []string) error {
        f, err := os.Create(filename)
        if err != nil {
                return err
        }
        defer f.Close()
        for _, v := range data {
                if _, err := f.WriteString(v); err != nil {
                        return err
                }
        }
        return nil
}
beastie ★★★★★
()
Ответ на: комментарий от redixin

300К строчек текста в памяти, да еще и в двух экземплярах. Вот что не так.

Нужно каждую строку записывать в файл как только она появилась. Все в памяти держать не нужно (если это конечно допустимо в рамках задачи).

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

redixin ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.