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

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

如何通過在 GO 中反映來獲取結(jié)構(gòu)字段的地址

如何通過在 GO 中反映來獲取結(jié)構(gòu)字段的地址

Go
千巷貓影 2023-06-05 17:23:48
我正在編寫將字節(jié)流反序列化為對(duì)象的代碼,我一直在獲取結(jié)構(gòu)字段的指針?;旧洗a的工作方式如下:它獲取指向結(jié)構(gòu)的指針,然后根據(jù)它序列化它的類型,例如。如果它是一個(gè)整數(shù),它需要接下來的 4 個(gè)字節(jié)。棘手的情況是,如果它是一個(gè)結(jié)構(gòu),因?yàn)槲冶仨殞?duì)其所有屬性遞歸運(yùn)行反序列化,而且我不知道如何獲取其字段的地址以將它們傳遞給反序列化。func Deserialize(objPtr interface{}, b []byte) (bytesRead int) {    // it should be the address of the object    val := reflect.ValueOf(objPtr).Elem()    valPtr := reflect.ValueOf(objPtr)    // check if either the object or *object is Serializable    _, isSerializable := (val.Interface()).(Serializable)    _, bo := (valPtr.Interface()).(Serializable)    isSerializable = isSerializable || bo    // specific type serialization    if isSerializable{        return objPtr.(Serializable).Deserializebyte(b)    }    switch val.Kind() {    case reflect.Uint32, reflect.Int, reflect.Int32:        res := reflect.ValueOf(binary.LittleEndian.Uint32(b[:4]))        valPtr.Set(res)        return 4    case reflect.Uint64, reflect.Int64:        res := reflect.ValueOf(binary.LittleEndian.Uint32(b[:8]))        valPtr.Set(res)        return 8    case reflect.Struct:        n_bytes := 0        for i := 0; i < val.NumField(); i++ {            // stuck in here            valPtr.Elem()            // I don't think the next line works            last_n_bytes := Deserialize(&(valPtr.Elem().Field(i).Interface()), b)            n_bytes += last_n_bytes            b = b[last_n_bytes:]        }        //valPtr.Set(res)        return n_bytes    default:        panic("this panic is for debug, every case should be handled above")        res := val.Bytes()        valPtr.Set(res)        return len(val.Bytes())    }    return 0}
查看完整描述

1 回答

?
夢(mèng)里花落0921

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

使用 reflect API 獲取字段的地址:

last_n_bytes?:=?Deserialize(valPtr.Elem().Field(i).Addr().Interface(),?b)

superint示例發(fā)生錯(cuò)誤,因?yàn)閼?yīng)用程序通過反射 API 獲取了未導(dǎo)出字段的地址。這是不允許的,因?yàn)樗鼤?huì)允許另一個(gè)包修改該字段。

這是一個(gè)導(dǎo)出字段的工作示例:

type superint struct {

? ? A int

? ? B int

}


func (s *superint) lol() {}


type a interface{ lol() }


func main() {

? ? i := superint{A: 1, B: 9}

? ? valPtr := reflect.ValueOf(&i)

? ? fmt.Printf("%v \n", &i.A)

? ? fmt.Printf("%v \n", valPtr.Elem().Field(0).Addr().Interface())

}


查看完整回答
反對(duì) 回復(fù) 2023-06-05
  • 1 回答
  • 0 關(guān)注
  • 213 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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