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

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

使用反射和動態(tài)類型附加到 go lang 切片

使用反射和動態(tài)類型附加到 go lang 切片

Go
千萬里不及你 2022-06-27 09:35:50
,有一個給定的結構(Foo)。我發(fā)現(xiàn)這個概念很有趣,并且想知道對于動態(tài)類型也可以這樣做。給定以下動態(tài)結構(完美運行),您如何創(chuàng)建切片并附加到它?在這里查看我的嘗試:在這個片段中,我創(chuàng)建了動態(tài)類型。這工作正常。        typeString := reflect.TypeOf("")        typeInteger := reflect.TypeOf(0)        fields := make(map[string]*reflect.StructField)        fields["A"] = &reflect.StructField{                Name: "A",                Type: typeString,                Tag:  reflect.StructTag(`json:"a"`),        }        fields["B"] = &reflect.StructField{                Name: "B",                Type: typeInteger,                Tag:  reflect.StructTag(`json:"b"`),        }        var structFields []reflect.StructField        for _, v := range fields {                structFields = append(structFields, *v)        }        structType := reflect.StructOf(structFields)使用該結構,我們看到它工作正常:        v := reflect.New(structType)        v.Elem().FieldByName("A").SetString("qwer")        v.Elem().FieldByName("B").SetInt(123)        v2 := reflect.New(structType)        v2.Elem().FieldByName("A").SetString("asdf")        v2.Elem().FieldByName("B").SetInt(456)        //+ these look good        fmt.Printf("%v\n", v)        fmt.Printf("%v\n", v2)然而,進入動態(tài)切片,我們得到一個錯誤:        reflection := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(structType).Elem()), 0, 0)        reflectionValue := reflect.New(reflection.Type())        reflectionValue.Elem().Set(reflection)        slicePtr := reflect.ValueOf(reflectionValue.Interface())        sliceValuePtr := slicePtr.Elem()        value := v.Elem()        // ERROR HERE        toSet := reflect.Append(sliceValuePtr, value)需要調(diào)整什么以使所有內(nèi)容都對齊并且Append?在操場上查看以下內(nèi)容:https://play.golang.org/p/Vrx7FTlVBp9
查看完整描述

2 回答

?
千巷貓影

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

值為structTypea reflect.Type。該表達式reflect.TypeOf(structType)計算reflect.Typefor reflect.Type。直接使用structType而不是調(diào)用reflect.TypeOf(structType).


typeString := reflect.TypeOf("")

typeInteger := reflect.TypeOf(0)

fields := make(map[string]*reflect.StructField)

fields["A"] = &reflect.StructField{

    Name: "A",

    Type: typeString,

    Tag:  reflect.StructTag(`json:"a"`),

}

fields["B"] = &reflect.StructField{

    Name: "B",

    Type: typeInteger,

    Tag:  reflect.StructTag(`json:"b"`),

}

var structFields []reflect.StructField

for _, v := range fields {

    structFields = append(structFields, *v)

}


structType := reflect.StructOf(structFields)


v := reflect.New(structType)

v.Elem().FieldByName("A").SetString("qwer")

v.Elem().FieldByName("B").SetInt(123)


v2 := reflect.New(structType)

v2.Elem().FieldByName("A").SetString("asdf")

v2.Elem().FieldByName("B").SetInt(456)


//+ these look good

fmt.Printf("%v\n", v)

fmt.Printf("%v\n", v2)


reflection := reflect.MakeSlice(reflect.SliceOf(structType), 0, 0)


fmt.Printf("typeof structType: %v\n", structType)

fmt.Printf("typeof structType | elem: %v\n", reflect.TypeOf(structType).Elem())


reflectionValue := reflect.New(reflection.Type())

reflectionValue.Elem().Set(reflection)


slicePtr := reflect.ValueOf(reflectionValue.Interface())


sliceValuePtr := slicePtr.Elem()


value := v.Elem()


fmt.Printf("value: %T = (%v)\n", value, value)

fmt.Printf("slice: %T = (%v)\n", sliceValuePtr, sliceValuePtr)


toSet := reflect.Append(sliceValuePtr, value)

fmt.Printf("toSet: %T = (%v)\n", toSet, toSet)


sliceValuePtr.Set(toSet)


result := sliceValuePtr.Interface()


fmt.Printf("result: %T = (%v)\n", result, result)

在 Go 操場上運行它。


這是代碼的簡化版本:


stringType := reflect.TypeOf("")

intType := reflect.TypeOf(0)

t := reflect.StructOf([]reflect.StructField{

    {

        Name: "A",

        Type: stringType,

        Tag:  reflect.StructTag(`json:"a"`),

    },

    {

        Name: "B",

        Type: intType,

        Tag:  reflect.StructTag(`json:"b"`),

    },

})


v1 := reflect.New(t).Elem()

v1.FieldByName("A").SetString("qwer")

v1.FieldByName("B").SetInt(123)


v2 := reflect.New(t).Elem()

v2.FieldByName("A").SetString("asdf")

v2.FieldByName("B").SetInt(456)


slice := reflect.MakeSlice(reflect.SliceOf(t), 0, 0)

slice = reflect.Append(slice, v1, v2)

fmt.Printf("result: %s = (%v)\n", slice.Type(), slice)


查看完整回答
反對 回復 2022-06-27
?
SMILET

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

如您所知,reflect.TypeOf返回傳遞給它的值的類型的reflect.Type表示。因此,如果您有一個值,例如,其類型為并且您將其傳遞給,則返回的將是該值所表示的類型的表示,而不是該類型的表示。structType reflect.Typereflect.TypeOfreflect.Typereflect.TypestructType


把事情簡單化。


slice := reflect.MakeSlice(reflect.SliceOf(structType), 0, 0)

slice = reflect.Append(slice, v.Elem())

slice = reflect.Append(slice, v2.Elem())

https://play.golang.org/p/p_3TI0gdvHl


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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