リフレクションを使用して Go のインターフェイスに Nil 値を渡すにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-17 12:01:01
オリジナル
892 人が閲覧しました

How Can I Pass a Nil Value to an Interface in Go Using Reflection?

Go のリフレクション経由でインターフェイスに Nil 値を渡す

Go では、インターフェイスはさまざまな型の値を単一のエンティティとして表す方法を提供します。ただし、引数として nil 値をインターフェイスに渡すことは、特にリフレクション経由では難しい場合があります。

インターフェイス エラーを引数として受け取る関数 f() を考えてみましょう。

func f(e error) {
    if e == nil {
        fmt.Println("YEY! NIL")
    } else {
        fmt.Println("NOT NIL :(")
    }
}
ログイン後にコピー

リフレクションを使用してこの関数に nil 値を渡したいとします。 2 つのアプローチが試行されます:

アプローチ 1:

nilArg := reflect.Zero(reflect.TypeOf((error)(nil)))
ログイン後にコピー

ただし、reflect.Zero(nil) が許可されていないため、このアプローチはパニックになります。

アプローチ2:

nilArg := reflect.Zero(reflect.TypeOf(&MyError{}))
ログイン後にコピー

エラー用の nil インターフェイス値が作成されないため、このアプローチは失敗します。

解決策は、reflect.TypeOf((*error)( nil)).Elem() を使用してインターフェースの具体的な型を取得します。エラー:

nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
ログイン後にコピー

このトリックは、リフレクトする nil 値へのポインタ。TypeOf() を使用すると、リフレクション システムが具象タイプを決定できます。次に、Elem() メソッドは、ポインターの基になる型を取得します。

この式を使用して nilArg を作成すると、リフレクションを介して関数 f() に真の nil 値を渡すことができます。

rf := reflect.ValueOf(f)
rf.Call([]reflect.Value{nilArg})
ログイン後にコピー

この呼び出しにより、関数内の if ステートメントが正しく実行され、「YEY! NIL」が出力されます。

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

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