Функция gob.NewEncoder

Функция gob.NewEncoder создает новый кодировщик, который записывает gob представление данных в указанный поток вывода. В качестве параметра функция принимает объект, реализующий интерфейс io.Writer. Возвращаемое значение - указатель на структуру gob.Encoder. Кодировщик используется для преобразования структур, карт, срезов и других типов данных в бинарный формат gob.

Синтаксис

gogob.NewEncoder(w io.Writer) *gob.Encoder

Пример

Давайте создадим кодировщик для записи в буфер и закодируем простую строку:

gopackage main

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

func main() {
  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  res := "example string"
  err := enc.Encode(res)
  if err != nil {
    fmt.Println("error:", err)
    return
  }
  fmt.Printf("% x", buf.Bytes())
}

Результат выполнения кода:

go"0f ff 81 03 01 02 ff 82 00 01 0c 01 0c 00 00 2d 65 78 61 6d 70 6c 65 20 73 74 72 69 6e 67"

Пример

Давайте закодируем структуру с полями разных типов:

gopackage main

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

type Person struct {
  Name  string
  Age   int
  Email   string
}

func main() {
  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  
  person := Person{
    Name:  "John Doe",
    Age:   30,
    Email: "john@example.com",
  }
  
  err := enc.Encode(person)
  if err != nil {
    fmt.Println("error:", err)
    return
  }
  fmt.Printf("encoded data length: %d bytes", buf.Len())
}

Результат выполнения кода:

go"encoded data length: 43 bytes"

Пример

Давайте закодируем срез целых чисел:

gopackage main

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

func main() {
  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  
  numbers := []int{1, 2, 3, 4, 5}
  
  err := enc.Encode(numbers)
  if err != nil {
    fmt.Println("error:", err)
    return
  }
  fmt.Println("successfully encoded slice")
}

Результат выполнения кода:

go"successfully encoded slice"

Пример

Давайте закодируем структуру с вложенным полем и указателем:

gopackage main

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

type Address struct {
  City  string
  Country string
}

type User struct {
  Username string
  Address  *Address
  Active   bool
}

func main() {
  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  
  user := User{
    Username: "johndoe",
    Address: &Address{
      City:  "New York",
      Country: "USA",
    },
    Active: true,
  }
  
  err := enc.Encode(user)
  if err != nil {
    fmt.Println("error:", err)
    return
  }
  fmt.Println("encoded data size:", buf.Len())
}

Результат выполнения кода:

go"encoded data size: 39"

Смотрите также

  • функцию gob.NewDecoder,
    которая создает новый декодер для чтения gob данных
  • функцию gob.Encoder.Encode,
    которая выполняет кодирование данных в gob формат
  • функцию gob.Decoder.Decode,
    которая декодирует gob данные в указанную переменную
  • функцию gob.Register,
    которая регистрирует пользовательские типы для gob