複数のケースを使用した型切り替え
Go では、型切り替えステートメントを使用して、型に基づいて対応するケースを動的に選択できます。値。 1 つのケースで複数の型が指定されている場合、値の型がリストされている型のいずれにも一致しない場合、エラーが発生する可能性があります。
次のコード スニペットを検討してください:
package main import ( "fmt" ) type A struct { a int } func(this *A) test(){ fmt.Println(this) } type B struct { A } func main() { var foo interface{} foo = A{} switch a := foo.(type){ case B, A: a.test() } }
このコードを実行すると、次のエラーが生成されます:
a.test undefined (type interface {} is interface with no methods)
このエラーは、変数 a の型が次であるため、型の切り替えが有効にならなかったことを示します。
Go 言語仕様では、型切り替えステートメントで 1 つのケースに複数の型が指定されている場合、そのケースで宣言された変数にはタイプ スイッチ ガード内の式のタイプ (この場合は foo)。 foo はインターフェイス{} タイプであるため、a もインターフェイス{} タイプになります。
この問題を解決して test() メソッドを確実に呼び出せるようにするには、foo に test(
package main import ( "fmt" ) type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } type tester interface { test() } func main() { var foo interface{} foo = &B{} if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() } }
foo に test() メソッドがあることをアサートすることで、適切な型の値を取得して test() メソッドを呼び出すことができます。成功しました。
以上がメソッドエラーを避けるために、Go の型スイッチで複数のケースを正しく使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。