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 サイトの他の関連記事を参照してください。