私は現在、golangs Reflect パッケージの動作に必死になっていますが、これはまったく一貫していないようです。
1)私が理解している限り、reflect.Value は基になる値へのポインタを持っているようです。たとえば、私が電話した場合
var s string
v1 := reflect.ValueOf(&s).Elem()
v2 := v1
v2.SetString("Hello World!")
fmt.Println(s)
「Hello World!」と表示されます。ただし、これは、Field() の呼び出しによって取得された Reflect.Value には当てはまらないようです。
val := ... //Assign a reflect.Value to it
nextval := val.Field(0) //Make sure that Field exists and is of type map
nextval = reflect.MakeMap(reflect.MapOf(KEY, ELEM))
nextval.SetMapIndex(Some_value_of_type_KEY, Something_of_type_ELEM)
fmt.Println(nextval.MapKeys()
fmt.Println(val.Field(index).MapKeys())
これは印刷します
[Some_value_of_type_KEY]
[]
これは大きな迷惑です。なぜこれが事実なのか誰にも分かりますか?
================================================== =
2) 機能を考える
func Test(v interface{}) {
val := reflect.ValueOf(v)
if val.Kind() != reflect.Struct {
fmt.Println("It is a struct")
}
}
構造体を引数として呼び出すと、「これは構造体です」と出力されます。ただし、値がアドレス指定できないため、val を使用して v 内のものに新しい値を割り当てることはできません。次の方法で回避します。
func Test(v interface{}) {
val := reflect.ValueOf(&v).Elem()
if val.Kind() != reflect.Struct {
fmt.Println("This never get's printed!")
}
}
According to the doc, I would assume, that by taking the '&' I use a pointer to v and by the call of Elem() I get the element it points to, therefore val.Kind() should still return the same thing. It doesn't. val.Kind() now is a reflect.Interface.
Is there a way of not having to go
valForTestingKind := reflect.ValueOf(v)
valForSettingNewValue := reflect.ValueOf(&v).Elem()
as this somehow feels wrong.