Go でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-20 01:34:03
オリジナル
196 人が閲覧しました

How do I change the pointer type and value of an interface variable using reflection in Go?

リフレクションを使用したインターフェイスでのポインターの型と値の変更

Go でインターフェイスを操作する場合、すべてが値によって渡されることを理解することが重要です。インターフェースも例外ではありません。その結果、インターフェイス値を割り当てると、基になる (値; タイプ) ペアを含むその値のコピーが作成されます。これは、コピーに加えられた変更は元の変数には影響しないことを意味します。

インターフェイス変数のポインターの型と値を変更するには、変数のアドレスをリフレクション パッケージに渡す必要があります。これは、リフレクションが値に作用し、アドレスを渡すことでコピーではなく実際の変数を変更できるためです。

このアプローチを示すコードの修正バージョンを次に示します。

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()) // Hello, My name is John

    // Get the value of the pointer to variable 'a'
    v := reflect.ValueOf(&a).Elem()

    // Set the pointer to variable 'a' to point to a new Greeter2 struct
    v.Set(reflect.ValueOf(&Greeter2{"Jack"}))

    // Print the updated value of 'a'
    fmt.Println(a.String()) // Hello2, My name is Jack

    // Set a new value to 'a'
    a = &Greeter2{"Ron"}

    // Print the updated value of 'a'
    fmt.Println(a.String()) // Hello2, My name is Ron
}
ログイン後にコピー

このコードでは、まずインターフェイス変数 'a' を作成し、それを Greeter 構造体で初期化します。次に、リフレクション パッケージを使用して「a」へのポインターの値を取得し、新しい Greeter2 構造体を指すように設定します。最後に、リフレクション操作後と、「a」を新しい値に直接設定した後の両方で、「a」の更新された値を出力します。

プログラムの出力は次のとおりです。

Hello, My name is John
Hello2, My name is Jack
Hello2, My name is Ron
ログイン後にコピー

これは、リフレクションを使用してインターフェイス変数 'a' のポインターの型と値を正常に変更したことを示しています。 *Greeter2 のみが fmt.Stringer を実装し、Greeter ではないため、この手法はポインター自体ではなく、ポイントされた値を変更する場合にのみ機能することに注意してください。

以上がGo でリフレクションを使用してインターフェイス変数のポインタの型と値を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート