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)

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
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報