2017-09-17 5 views
0

map[string]stringとカスタムGo構造の間で状態を同期させたいと思って、構文解析する最も簡単な方法はフィールドにfmt.Sscanを使用することです。fmt.Sscanで構造体の値を設定する

残念ながら、直接的なアプローチは、(playground)動作していない:

var S struct{ I int } 

f := reflect.Indirect(reflect.ValueOf(&S)).Field(0) 
fmt.Sscan("10", f.Interface()) 
fmt.Println(S) // {0} 

中間値を紹介してSet()を使用して、しかし、問題を解決します

nv := reflect.New(f.Type()) 
fmt.Sscan("10", nv.Interface()) 
f.Set(reflect.Indirect(nv)) 
fmt.Println(S) // {10} 

最初のアプローチはdidnのなぜ私が疑問に思います仕事はありません。 Interface()は、その値を変更するために使用できるフィールドへの参照の種類を返しますか?

+0

'fmt.Sscan(「10」、&S.Iを使用することは適切ではない理由を説明してください) '(期待どおりに動作する)。 –

+1

@KavehShahbazian構造の型がわからないため – myaut

答えて

2

Interface()メソッドは、値への参照ではなく値を返します。フィールドに直接スキャンするフィールドの(Addr()を呼び出すことによって)アドレスを取る:

var S struct{ I int } 
f := reflect.Indirect(reflect.ValueOf(&S)).Field(0) 
fmt.Sscan("10", f.Addr().Interface()) 
fmt.Println(S) // {0} 

https://play.golang.org/p/6_4DjiFZB2

関連する問題