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 — локальная установка не требуется.
Все уроки этого курса
- Повторение encoding/json
- encoding/xml
- encoding/csv
- gob и двоичное кодирование