Go で複数のケースを使用した型スイッチ
複数のケースを使用した型スイッチを使用すると、変数が複数のタイプがある場合は未定義です。この動作は、型スイッチ ガードに短い変数宣言を含めることができるという Go 言語仕様に由来しています。
そのような場合、変数は単一型の場合にリストされている型と同じ型になります。ただし、複数の型のリストがある場合、変数は型スイッチ ガード内の式の型を持ちます。
これを説明するには、次のコードを考えてみましょう。
type A struct { a int } func (this *A) test() { fmt.Println(this) } type B struct { A } var foo interface{} foo = A{} switch a := foo.(type) { case B, A: a.test() }
Runningこのコードでは、「a.test 未定義 (タイプ インターフェイス {} はメソッドのないインターフェイスです)」というエラーが発生します。これは、変数 a の型が、特定のケースの型ではなく、interface{} であるためです。
この問題を解決するには、型スイッチ ガード式に期待されるメソッドがあると主張できます。例:
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() メソッドがあるかどうかを確認し、ある場合は foo の値を a に代入して test() メソッドを呼び出します。
以上がGo で複数のケースを含む型スイッチが「未定義」変数エラーを引き起こすのはなぜですか?これはどのように解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。