第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法反序列化結構(“類型的值不可分配給類型”)

無法反序列化結構(“類型的值不可分配給類型”)

Go
紅糖糍粑 2023-07-31 16:35:19
我在嘗試反序列化結構時遇到問題。我嘗試過使用 JSON 和 YAML,重寫結構以使用切片而不是地圖(認為這是我使用地圖的問題),但都無濟于事。下面的結構包含問題,特別是反序列化函數(shù)。我已將不相關的代碼替換為...:type Collection struct {    Objects []Object `yaml:"objects,omitempty"`}...func (c *Collection) Serialize() ([]byte, error) {    return yaml.Marshal(c)}func (c *Collection) Deserialize(raw []byte) error {    return yaml.Unmarshal(raw, c)}我的測試序列化一個集合,然后嘗試將第一個集合中的原始數(shù)據(jù)反序列化到第二個集合中。然后它將比較兩個集合,但問題在反序列化期間出現(xiàn):func TestDeserialize(t *testing.T) {    c := NewCollection()    // NewRect creates a Rect (inherits from Object)    c.AddObject(NewRect(10,10,NewPos(0,0))    c2 := NewCollection()    v raw, err := c.Serialize()    if err != nil {        t.Fatalf("collection 1 failed to serialize: %v", err)    }    // deserialize raw 1 into 2    // this is the call that fails    err = c2.Deserialize(raw)    if err != nil {        t.Fatalf("collection 2 failed to deserialize: %v", err)    }}這是我不斷遇到的錯誤:panic: reflect.Set: value of type map[interface {}]interface {} is not assignable to type bw.Object [recovered]    panic: reflect.Set: value of type map[interface {}]interface {} is not assignable to type bw.Object [recovered]    panic: reflect.Set: value of type map[interface {}]interface {} is not assignable to type bw.Object編輯:我忘記包含 的定義Object。Object是一個非?;镜慕缑妫簍ype Object interface {    Update()    Draw()    Serialize()    Deserialize()}
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻1810條經(jīng)驗 獲得超4個贊

這在序列化時會起作用,因為在序列化期間Objects數(shù)組的每個元素都是結構。當你反序列化時它將不起作用,因為在反序列化期間,Objects是一個空的接口數(shù)組。您不能解組到接口,只能解組到結構或值。


要解決此問題,您必須在反序列化期間找出每個數(shù)組元素的類型Objects,然后根據(jù)結構進行反序列化。有多種方法可以做到這一點。


一種方法是使用fat 接口,這是一個包含所有可能項目的臨時結構:


type unmarshalObject struct {

   Type string `yaml:"type"`

   // All possible fields of all possible implementations

}


type unmarshalCollection struct {

    Objects []unmarshalObject `yaml:"objects,omitempty"`

}


func (c *Collection) Deserialize(raw []byte) error {

    var intermediate unmarshalCollection

    yaml.Unmarshal(raw, &intermediate)

    c.Objects=make([]Object,0)

    for _,object:=range intermediate.Objects {

        switch object.Type {

          case "rect":

             c.Objects=append(c.Objects,Rectangle{X1:object.X1,...})

          case "...":

           ...

        }

    }

    return nil

}

錯誤檢查被省略。


可以使用相同的方法來map[string]interface{}代替unmarshalObject,但這需要大量的類型斷言。


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號