亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何通過 Go 中的反射更新結構的數組字段值?

如何通過 Go 中的反射更新結構的數組字段值?

Go
慕標琳琳 2022-05-05 18:07:37
我想將結構字段的值編輯為 interface{} 參數。我幾乎完成了,但是當 struct 有數組字段時,我無法修改它。我試圖找到具有數組值的正確函數,但我找不到。這是我的代碼。edit_struct_via _interface.gopackage mainimport (    "reflect"    "fmt")type myStruct struct {    Name    [8]byte    TID     [4]byte    Chksum  uint16}func main() {    var s = new(myStruct)    name := []byte("Mike")    tid  := []byte{0x01, 0x02, 0x03, 0x05}    setArrayField(name, s.Name[:])    setArrayField(tid, s.TID[:])    s.Chksum = 0x0101    myObj := reflect.ValueOf(s).Elem()    typeOfMyObj := myObj.Type()    for i := 0; i < myObj.NumField(); i++ {        f := myObj.Field(i)        fmt.Printf("%d: %s %s = %v\n", i,            typeOfMyObj.Field(i).Name, f.Type(), f.Interface())    }    newName := []byte("Emil")    myObj.Field(0).SetBytes(newName[:])    // I trying to change array field at here, but panic occur here.    // Because SetBytes must been called on slice, but myObj.Field(0) is array.    myObj.Field(2).SetUint(99)             // It works.    fmt.Println("s is now: ", *s)}func setArrayField(src []byte, target []byte) {    // retun if src is bigger than target    if len(src) > len(target){        return    }    for index, item := range src {        target[index] = item    }}當我運行上面的代碼時,我得到0: Name [8]uint8 = [77 105 107 101 0 0 0 0]1: TID [4]uint8 = [1 2 3 5]2: Chksum uint16 = 257panic: reflect: call of reflect.Value.SetBytes on array Valuegoroutine 1 [running]:reflect.flag.mustBe(...)        /usr/local/go/src/reflect/value.go:208reflect.Value.SetBytes(0x4a6180, 0xc000098010, 0x191, 0xc000098078, 0x4, 0x4)        /usr/local/go/src/reflect/value.go:1557 +0x140main.main()        /home/hornet/go/src/gateway-golang/edit_struct_via _interface.go:33 +0x522exit status 2我正在使用 Ubuntu 18.04 和 go1.13 linux/amd64
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

SetBytes的文檔說:

SetBytes 設置 v 的基礎值。如果 v 的基礎值不是字節切片,它會恐慌。

下級值是恐慌消息中所述的數組。

通過將字節復制到數組來修復:

reflect.Copy(myObj.Field(0), reflect.ValueOf(newName))

在操場上運行它。


查看完整回答
反對 回復 2022-05-05
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

SetBytes適用于切片。Name不是切片,而是數組[8]byte

切片和數組之間存在重要區別,您不能真正將一個用于另一個。切片具有對數組的引用,當您傳遞切片時,您將引用傳遞給支持數組。數組就像一個結構,當您將數組傳遞給函數時,您傳遞的是該數組的副本,而不是對它的引用。

您可以使用 reflect.Copy 復制字節:

reflect.Copy(myObj.Field(0), reflect.ValueOf(newName))


查看完整回答
反對 回復 2022-05-05
  • 2 回答
  • 0 關注
  • 259 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號