首頁  >  文章  >  後端開發  >  為什麼 Gob 在編碼 map[string]interface{} 時會拋出「gob:類型未註冊介面:map[string]interface {}」?

為什麼 Gob 在編碼 map[string]interface{} 時會拋出「gob:類型未註冊介面:map[string]interface {}」?

Susan Sarandon
Susan Sarandon原創
2024-11-19 13:06:03935瀏覽

Why does Gob throw

gob:使用介面編碼地圖

嘗試使用Gob 對map[string]interface{} 進行編碼時,使用者可能會遇到錯誤訊息:「gob:類型未註冊介面:map[string]interface {}。」出現此錯誤的原因是Gob要求在處理正在編碼的資料之前先註冊其類型。

此問題的解決方案很簡單:使用 gob.Register 函數向 Gob 註冊類型。在這種情況下,應將以下程式碼新增至程式:

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

此註冊步驟通知 Gob 它應該能夠使用字串鍵和介面值對映射進行編碼和解碼。

為了示範這一點,請考慮以下修改後的程式碼:

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))
}

現在,當執行此程式碼時,Gob 編碼器會成功編碼將[string]interface{}映射到位元組數組中。錯誤訊息將不再顯示。

以上是為什麼 Gob 在編碼 map[string]interface{} 時會拋出「gob:類型未註冊介面:map[string]interface {}」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn