Функция gob.RegisterName
Функция gob.RegisterName из пакета encoding/gob регистрирует
конкретный тип данных, чтобы его можно было кодировать и декодировать
с помощью gob, используя при этом пользовательское имя вместо имени типа.
В первый параметр передается строка с желаемым именем типа,
во второй параметр передается значение типа (обычно передается
нулевое значение или переменная нужного типа). Эта функция особенно
полезна в ситуациях, когда имя типа в коде может измениться,
а необходимо сохранить совместимость с ранее закодированными данными.
Синтаксис
gob.RegisterName(name, value)
Пример
Давайте зарегистрируем тип User с пользовательским именем
"CustomUser" и закодируем его в gob:
package 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())
}
Результат выполнения кода:
"Encoded data size: 28 bytes"
Пример
Давайте зарегистрируем тип Point под именем "Coordinate"
и выполним полный цикл кодирования и декодирования:
package 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)
}
Результат выполнения кода:
"{X:10 Y:20}"
Пример
Если тип зарегистрирован с пользовательским именем, то при декодировании можно использовать любое имя, зарегистрированное в системе, например, "Coordinate":
package 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)
}
Результат выполнения кода:
"5"
"7"
Смотрите также
-
функцию
gob.Register,
которая регистрирует тип с использованием имени типа по умолчанию -
функцию
gob.NewEncoder,
которая создает новый кодировщик gob -
функцию
gob.NewDecoder,
которая создает новый декодировщик gob -
функцию
gob.Encoder.Encode,
которая кодирует данные в поток gob