0Pricing
Go Academy · Урок

gob и двоичное кодирование

Кодируйте значения Go

«gob и двоичное кодирование» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое gob

encoding/gob — двоичный формат, специфичный для Go, предназначенный для сериализации значений Go. Он компактен и быстр, поэтому идеально подходит для обмена между программами на Go и хранения на диске.

gob и JSON

JSON является текстовым, удобным для чтения человеком и поддерживается разными языками. gob — двоичный формат только для Go, зато он компактнее и быстрее кодируется. Используйте gob, когда обе стороны представлены программами на Go.

Кодирование в буфер

gob.Encoder записывает данные в любой io.Writer. Здесь для хранения двоичного вывода используется bytes.Buffer.

package main

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

func main() {
	var buf bytes.Buffer
	enc := gob.NewEncoder(&buf)
	enc.Encode(42)
	fmt.Println("bytes written:", buf.Len())
}

Декодирование из буфера

gob.Decoder считывает данные из io.Reader и заполняет указатель, как Unmarshal.

package main

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

func main() {
	var buf bytes.Buffer
	gob.NewEncoder(&buf).Encode(42)
	var n int
	gob.NewDecoder(&buf).Decode(&n)
	fmt.Println(n)
}

Кодирование структур

gob естественным образом обрабатывает структуры. Кодируются только экспортируемые поля.

package main

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

type User struct {
	Name string
	Age  int
}

func main() {
	var buf bytes.Buffer
	gob.NewEncoder(&buf).Encode(User{"Ann", 30})
	var u User
	gob.NewDecoder(&buf).Decode(&u)
	fmt.Println(u)
}

Кодирование карт и срезов

Составные типы, такие как карты и срезы, прозрачно кодируются и декодируются.

package main

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

func main() {
	var buf bytes.Buffer
	gob.NewEncoder(&buf).Encode([]int{1, 2, 3})
	var s []int
	gob.NewDecoder(&buf).Decode(&s)
	fmt.Println(s)
}

Самоописывающиеся потоки

Потоки gob содержат информацию о типах, поэтому декодер может восстановить значения даже при сопоставлении с немного отличающейся, но совместимой структурой. Лишние или отсутствующие поля допускаются.

Только экспортируемые поля

Как и JSON, gob кодирует только экспортируемые поля. Неэкспортируемые поля (начинающиеся со строчной буквы) молча пропускаются.

package main

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

type T struct {
	Public  int
	private int
}

func main() {
	var buf bytes.Buffer
	gob.NewEncoder(&buf).Encode(T{Public: 1, private: 2})
	var out T
	gob.NewDecoder(&buf).Decode(&out)
	fmt.Println(out.Public, out.private)
}

Другие варианты двоичного кодирования

Для необработанных двоичных данных фиксированного размера encoding/binary записывает целые числа и числа с плавающей точкой в порядке от старшего байта к младшему или наоборот. Этот пакет работает на более низком уровне, чем gob, и не содержит описания данных.

package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
)

func main() {
	var buf bytes.Buffer
	binary.Write(&buf, binary.BigEndian, uint32(258))
	fmt.Println(buf.Bytes())
}

Когда что использовать

Выбирайте:

  • json — API, конфигурация, взаимодействие между языками
  • gob — обмен между программами на Go, компактность, удобная работа со структурами
  • binary — точная раскладка байтов, протоколы

Нечитаемый человеком формат

Вывод gob является двоичным; при печати отображается бессмысленный набор символов. Такова плата за компактность. Используйте его для машин, а не для журналов, которые читают люди.

Быстрая проверка

Когда gob подходит лучше, чем JSON?

Итоги

Кодирование gob и двоичных данных:

  • gob.NewEncoder/NewDecoder для двоичного обмена между программами на Go
  • Компактность, самоописание, только экспортируемые поля
  • encoding/binary для точной раскладки байтов
  • JSON по-прежнему лучше всего подходит для взаимодействия между языками и удобства чтения

Часто задаваемые вопросы

Урок «gob и двоичное кодирование» бесплатный?

Да — полный текст урока «gob и двоичное кодирование» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «gob и двоичное кодирование»?

Кодируйте значения Go Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «gob и двоичное кодирование»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Повторение encoding/json
  2. encoding/xml
  3. encoding/csv
  4. gob и двоичное кодирование
← Назад к Go Academy