構造体に埋め込まれたインターフェイスを使用したリフレクションの実行: 実関数の存在の検出
次の構造体を考えてみましょう:
type A interface { Foo() string } type B struct { A bar string }
B がインターフェイス A を実装する必要があると期待するのは慣用的であるように思えるかもしれませんが、 Go の型システムでは、明示的な実装を必要とせずに匿名インターフェイスを埋め込むことができます。
Go のリフレクションを使用すると、含まれている構造体の型から埋め込みインターフェイスのメソッドに直接アクセスできます。ただし、これにより、特に実行時に埋め込みインターフェイスに実装関数がない場合、予期しないエラーが発生する可能性があります。
リフレクションを使用して構造体に埋め込まれたインターフェイスに実際の関数が存在するかどうかを判断するには、次のメソッドを使用できます。テクニック:
このアプローチは、匿名インターフェイス値内の関数へのポインターがゼロであるかどうかを効果的に確認します。以下に例を示します。
func main() { bType := reflect.TypeOf(B{}) bMeth, has := bType.MethodByName("Foo") if has && bMeth != nil { fmt.Printf("HAS IT: %s\n", bMeth.Type.Kind()) // Call the function if it exists res := bMeth.Func.Call([]reflect.Value{reflect.ValueOf(B{})}) val := res[0].Interface() fmt.Println(val) } else { fmt.Println("DOESNT HAS IT") } }
このメソッドを使用すると、エラーを引き起こすことなく、組み込みインターフェイスの実関数の存在を安全に検出できます。これは、インターフェースが部分的に実装されているかどうかを判断し、それに応じて動作する方法を提供します。
以上がリフレクションを使用して Go の組み込みインターフェイス関数の存在を安全に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。