Функция gob.Register

Функция gob.Register регистрирует конкретный тип данных, чтобы он мог быть корректно передан через поток gob. Первым параметром функция принимает значение типа, который нужно зарегистрировать. Обычно передается нулевое значение типа, например, для структуры передается MyStruct{}. Регистрация необходима при передаче интерфейсных типов, чтобы кодек знал, какую конкретную реализацию использовать при декодировании.

Синтаксис

gogob.Register(value)

Пример

Давайте зарегистрируем пользовательскую структуру и передадим ее через gob:

gopackage main

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

type Person struct {
  Name string
  Age  int
}

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  dec := gob.NewDecoder(&network)

  gob.Register(Person{})

  data := Person{Name: "Alice", Age: 30}
  err := enc.Encode(data)
  if err != nil {
    log.Fatal(err)
  }

  var res Person
  err = dec.Decode(&res)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%+v", res)
}

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

go{Name:Alice Age:30}

Пример

Давайте зарегистрируем несколько типов, реализующих общий интерфейс:

gopackage main

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

type Animal interface {
  Speak() string
}

type Dog struct{}

func (Dog) Speak() string {
  return "Woof"
}

type Cat struct{}

func (Cat) Speak() string {
  return "Meow"
}

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  dec := gob.NewDecoder(&network)

  gob.Register(Dog{})
  gob.Register(Cat{})

  var animal Animal = Dog{}
  err := enc.Encode(&animal)
  if err != nil {
    log.Fatal(err)
  }

  var res Animal
  err = dec.Decode(&res)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println(res.Speak())
}

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

go"Woof"

Пример

Давайте зарегистрируем тип с пользовательским именем с помощью gob.RegisterName:

gopackage main

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

type Point struct {
  X int
  Y int
}

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  dec := gob.NewDecoder(&network)

  gob.RegisterName("MyPoint", Point{})

  data := Point{X: 10, Y: 20}
  err := enc.Encode(data)
  if err != nil {
    log.Fatal(err)
  }

  var res Point
  err = dec.Decode(&res)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%+v", res)
}

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

go{X:10 Y:20}

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

  • функцию gob.RegisterName,
    которая регистрирует тип с указанным именем
  • функцию gob.NewEncoder,
    которая создает новый кодировщик gob
  • функцию gob.NewDecoder,
    которая создает новый декодировщик gob
  • функцию gob.Encoder.Encode,
    которая кодирует данные в поток gob