Функция gob.RegisterName

Функция gob.RegisterName из пакета encoding/gob регистрирует конкретный тип данных, чтобы его можно было кодировать и декодировать с помощью gob, используя при этом пользовательское имя вместо имени типа. В первый параметр передается строка с желаемым именем типа, во второй параметр передается значение типа (обычно передается нулевое значение или переменная нужного типа). Эта функция особенно полезна в ситуациях, когда имя типа в коде может измениться, а необходимо сохранить совместимость с ранее закодированными данными.

Синтаксис

gogob.RegisterName(name, value)

Пример

Давайте зарегистрируем тип User с пользовательским именем "CustomUser" и закодируем его в gob:

gopackage main

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

type User struct {
  ID   int
  Name string
}

func main() {
  gob.RegisterName("CustomUser", User{})

  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)

  user := User{ID: 1, Name: "Alice"}
  err := enc.Encode(user)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Printf("Encoded data size: %d bytes\n", buf.Len())
}

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

go"Encoded data size: 28 bytes"

Пример

Давайте зарегистрируем тип Point под именем "Coordinate" и выполним полный цикл кодирования и декодирования:

gopackage main

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

type Point struct {
  X int
  Y int
}

func main() {
  gob.RegisterName("Coordinate", Point{})

  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)
  dec := gob.NewDecoder(&buf)

  original := Point{X: 10, Y: 20}
  err := enc.Encode(original)
  if err != nil {
    fmt.Println("Encode error:", err)
    return
  }

  var decoded Point
  err = dec.Decode(&decoded)
  if err != nil {
    fmt.Println("Decode error:", err)
    return
  }

  fmt.Printf("%+v\n", decoded)
}

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

go"{X:10 Y:20}"

Пример

Если тип зарегистрирован с пользовательским именем, то при декодировании можно использовать любое имя, зарегистрированное в системе, например, "Coordinate":

gopackage main

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

type Point struct {
  X int
  Y int
}

func main() {
  gob.RegisterName("Coordinate", Point{})

  var buf bytes.Buffer
  enc := gob.NewEncoder(&buf)

  original := Point{X: 5, Y: 7}
  enc.Encode(original)

  dec := gob.NewDecoder(&buf)
  var decoded Point
  dec.Decode(&decoded)

  fmt.Println(decoded.X)
  fmt.Println(decoded.Y)
}

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

go"5"
"7"

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

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