リフレクションを介してインターフェイスとして nil 値を渡す
インターフェイスにリフレクションすると、nil 値を効果的に渡すという課題が生じます。次の関数を考えてみましょう:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // Aim for this } else { fmt.Println("NOT NIL :(") } }
以下のコードを使用してリフレクション経由で関数に nil 値を渡そうとすると、パニックが発生します:
nilArg := reflect.Zero(reflect.TypeOf((error)(nil)))
Don'絶望するな!この問題を回避するには、式reflect.TypeOf((*error)(nil)).Elem()を利用して、インターフェイスエラーのreflect.Typeを取得します。このトリックには、非インターフェイス値をreflect.TypeOf()に渡し、reflect.Elem()を使用して目的の型を導出することが含まれます。
nilArg構造の場合、次を使用します:
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
理解を確実にするために、実際に動作するプレイグラウンドの例をお楽しみください。
以上がGo Reflection を使用して Nil インターフェイス値を安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。