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中文網其他相關文章!