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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

無(wú)法反序列化結(jié)構(gòu)(“類型的值不可分配給類型”)

無(wú)法反序列化結(jié)構(gòu)(“類型的值不可分配給類型”)

Go
紅糖糍粑 2023-07-31 16:35:19
我在嘗試反序列化結(jié)構(gòu)時(shí)遇到問(wèn)題。我嘗試過(guò)使用 JSON 和 YAML,重寫(xiě)結(jié)構(gòu)以使用切片而不是地圖(認(rèn)為這是我使用地圖的問(wèn)題),但都無(wú)濟(jì)于事。下面的結(jié)構(gòu)包含問(wèn)題,特別是反序列化函數(shù)。我已將不相關(guān)的代碼替換為...: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)}我的測(cè)試序列化一個(gè)集合,然后嘗試將第一個(gè)集合中的原始數(shù)據(jù)反序列化到第二個(gè)集合中。然后它將比較兩個(gè)集合,但問(wèn)題在反序列化期間出現(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)    }}這是我不斷遇到的錯(cuò)誤: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是一個(gè)非常基本的界面:type Object interface {    Update()    Draw()    Serialize()    Deserialize()}
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊

這在序列化時(shí)會(huì)起作用,因?yàn)樵谛蛄谢陂gObjects數(shù)組的每個(gè)元素都是結(jié)構(gòu)。當(dāng)你反序列化時(shí)它將不起作用,因?yàn)樵诜葱蛄谢陂g,Objects是一個(gè)空的接口數(shù)組。您不能解組到接口,只能解組到結(jié)構(gòu)或值。


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


一種方法是使用fat 接口,這是一個(gè)包含所有可能項(xiàng)目的臨時(shí)結(jié)構(gòu):


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

}

錯(cuò)誤檢查被省略。


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


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)