リフレクションを使用したインターフェイスでのポインターの型と値の変更
Go では、インターフェイスは特定のメソッドを定義するコントラクトを表しますが、型は指定しません基礎となるオブジェクトの。この柔軟性により、動的なバインディングが可能になりますが、インターフェイスで定義された変数のポインターの型と値を変更しようとするときに課題が生じる可能性もあります。
インターフェイスでポインターの型と値を変更できますか?
リフレクションを使用すると、インターフェースの下でポインター値を変更できます。反映値の要素を新しいポインタ値の要素に設定することで、値を変更できます。ただし、ポインタの型を直接変更することはできません。
リフレクションを使用してポインタ値を変更する
インターフェイスで定義された変数のポインタ値を変更するには、次の手順に従います。ステップ:
例
次のコードでは、 a の値はリフレクションを使用して Greeter2 オブジェクトを指すように変更され、同時に名前も "Jack" に更新されます:
package main import ( "fmt" "reflect" ) type Greeter struct { Name string } func (g *Greeter) String() string { return "Hello, My name is " + g.Name } type Greeter2 struct { Name string } func (g *Greeter2) String() string { return "Hello2, My name is " + g.Name } func main() { var a fmt.Stringer a = &Greeter{"John"} fmt.Println(a.String()) // Output: Hello, My name is John v := reflect.ValueOf(&a).Elem() v.Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem()) fmt.Println(a.String()) // Output: Hello2, My name is Jack }
注: 変数のポインター型を変更するには、アドレスで渡す必要があります。これは、Go がコピーによって値を渡し、ポインターのみが指す値を間接的に変更できるためです。
以上がGo のリフレクションを使用して、インターフェイスによって定義された変数のポインタ型と値を変更できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。