1 回答

TA貢獻1869條經(jīng)驗 獲得超4個贊
標(biāo)簽不屬于實例,標(biāo)簽屬于類型。
因此,當(dāng)您創(chuàng)建類型的新實例時,它們的類型將是相同的“佩戴”相同的標(biāo)簽。reflect使用文字或通過包創(chuàng)建新實例都沒有關(guān)系。
您的問題newFoo是 type reflect.Value,并且&newFoo是 type *reflect.Value,它不是指向您的 struct 的指針(不是 type *Foo)。
如果解開結(jié)構(gòu)值:
newFoo.Interface()
然后你通過它,你使Elem()調(diào)用成為可選的(只有當(dāng)它是一個指針時才這樣做):
func readTag(e interface{}) {
t := reflect.TypeOf(e)
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
f, _ := t.FieldByName("Bar")
fmt.Println(f.Tag)
}
然后你會得到相同的標(biāo)簽(在Go Playground上試試):
&{baz}
custom:"tag"
{baz2}
custom:"tag"
如果你保持reflect.Value包裝結(jié)構(gòu)指針,你會得到相同的結(jié)果,并從中解開:
newFooPtr := reflect.New(fooType)
newFoo := newFooPtr.Elem()
newFoo.FieldByName("Bar").SetString("baz2")
fmt.Println(newFoo)
readTag(newFooPtr.Interface()) // empty
那么readTag()就不需要修改了。在Go Playground上試試這個版本。
- 1 回答
- 0 關(guān)注
- 99 瀏覽
添加回答
舉報