Rumah >pembangunan bahagian belakang >Golang >Mengapa Gob membuang 'gob: type not registered for interface: map[string]interface {}' apabila mengekod peta[string]interface{}?

Mengapa Gob membuang 'gob: type not registered for interface: map[string]interface {}' apabila mengekod peta[string]interface{}?

Susan Sarandon
Susan Sarandonasal
2024-11-19 13:06:031036semak imbas

Why does Gob throw

gob: Pengekodan Peta dengan Antara Muka

Apabila cuba mengekod peta[rentetan]antaramuka{} menggunakan Gob, pengguna mungkin menghadapi ralat mesej: "gob: type not registered for interface: map[string]interface {}." Ralat ini berlaku kerana Gob memerlukan jenis data yang dikodkan didaftarkan sebelum ia boleh diproses.

Penyelesaian untuk masalah ini adalah mudah: daftarkan jenis dengan Gob menggunakan fungsi gob.Register. Dalam kes ini, kod berikut harus ditambahkan pada program:

gob.Register(map[string]interface{}{})

Langkah pendaftaran ini memaklumkan Gob bahawa ia sepatutnya dapat mengekod dan menyahkod peta dengan kunci rentetan dan nilai antara muka.

Untuk menunjukkan perkara ini, pertimbangkan kod yang disemak berikut:

package main

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

func CloneObject(a, b interface{}) []byte {
    gob.Register(map[string]interface{}{})
    buff := new(bytes.Buffer)
    enc := gob.NewEncoder(buff)
    dec := gob.NewDecoder(buff)
    err := enc.Encode(a)
    if err != nil {
        log.Panic("e1: ", err)
    }
    b1 := buff.Bytes()
    err = dec.Decode(b)
    if err != nil {
        log.Panic("e2: ", err)
    }
    return b1
}

func main() {
    var a interface{}
    a = map[string]interface{}{"X": 1}
    b2, err := json.Marshal(&a)
    fmt.Println(string(b2), err)

    var b interface{}
    b1 := CloneObject(&a, &b)
    fmt.Println(string(b1))
}

Kini, apabila kod ini dijalankan, pengekod Gob akan berjaya mengekod peta[rentetan]antara muka{} ke dalam tatasusunan bait. Mesej ralat tidak akan dipaparkan lagi.

Atas ialah kandungan terperinci Mengapa Gob membuang 'gob: type not registered for interface: map[string]interface {}' apabila mengekod peta[string]interface{}?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn