Функция gob.Register
Функция gob.Register регистрирует конкретный тип данных,
чтобы он мог быть корректно передан через поток gob. Первым параметром
функция принимает значение типа, который нужно зарегистрировать.
Обычно передается нулевое значение типа, например, для структуры
передается MyStruct{}. Регистрация необходима при передаче
интерфейсных типов, чтобы кодек знал, какую конкретную реализацию
использовать при декодировании.
Синтаксис
gob.Register(value)
Пример
Давайте зарегистрируем пользовательскую структуру и передадим ее через gob:
package 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)
}
Результат выполнения кода:
{Name:Alice Age:30}
Пример
Давайте зарегистрируем несколько типов, реализующих общий интерфейс:
package 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())
}
Результат выполнения кода:
"Woof"
Пример
Давайте зарегистрируем тип с пользовательским именем с помощью gob.RegisterName:
package 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)
}
Результат выполнения кода:
{X:10 Y:20}
Смотрите также
-
функцию
gob.RegisterName,
которая регистрирует тип с указанным именем -
функцию
gob.NewEncoder,
которая создает новый кодировщик gob -
функцию
gob.NewDecoder,
которая создает новый декодировщик gob -
функцию
gob.Encoder.Encode,
которая кодирует данные в поток gob