Метод gob.Decoder.Decode

Метод gob.Decoder.Decode выполняет декодирование данных формата gob, полученных от соответствующего Encoder, в переданную переменную. В качестве единственного параметра метод принимает указатель на переменную, в которую будет сохранен результат декодирования. Метод возвращает ошибку error, если декодирование не удалось.

Синтаксис

godecoder.Decode(&v)

Пример

Давайте создадим декодер на основе буфера с gob-данными и декодируем его в структуру:

gopackage main

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

type User struct {
  ID  int
  Name  string
  Email string
}

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  
  data := User{ID: 1, Name: "John", Email: "john@example.com"}
  err := enc.Encode(data)
  if err != nil {
    fmt.Println("Encode error:", err)
    return
  }
  
  dec := gob.NewDecoder(&network)
  
  var res User
  err = dec.Decode(&res)
  if err != nil {
    fmt.Println("Decode error:", err)
    return
  }
  
  fmt.Printf("ID: %d, Name: %s, Email: %s", res.ID, res.Name, res.Email)
}

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

go"ID: 1, Name: John, Email: john@example.com"

Пример

Давайте декодируем gob-данные в слайс строк:

gopackage main

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

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  
  original := []string{"a", "b", "c", "d", "e"}
  err := enc.Encode(original)
  if err != nil {
    fmt.Println("Encode error:", err)
    return
  }
  
  dec := gob.NewDecoder(&network)
  
  var res []string
  err = dec.Decode(&res)
  if err != nil {
    fmt.Println("Decode error:", err)
    return
  }
  
  fmt.Println(res)
}

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

go[a b c d e]

Пример

Давайте декодируем gob-данные в карту с числовыми ключами:

gopackage main

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

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  
  original := map[int]string{1: "one", 2: "two", 3: "three"}
  err := enc.Encode(original)
  if err != nil {
    fmt.Println("Encode error:", err)
    return
  }
  
  dec := gob.NewDecoder(&network)
  
  var res map[int]string
  err = dec.Decode(&res)
  if err != nil {
    fmt.Println("Decode error:", err)
    return
  }
  
  fmt.Println(res)
}

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

gomap[1:one 2:two 3:three]

Пример

Давайте обработаем ошибку декодирования для некорректных данных:

gopackage main

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

type User struct {
  ID   int
  Name string
}

func main() {
  var network bytes.Buffer
  enc := gob.NewEncoder(&network)
  
  err := enc.Encode("invalid data")
  if err != nil {
    fmt.Println("Encode error:", err)
    return
  }
  
  dec := gob.NewDecoder(&network)
  
  var res User
  err = dec.Decode(&res)
  if err != nil {
    fmt.Println("Decode failed:", err)
    return
  }
  
  fmt.Println("Decoded:", res)
}

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

go"Decode failed: gob: type mismatch: no fields matched compiling decoder for User"

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

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