Go 型スイッチにおける複数のケース
型スイッチ変数にインターフェイス値を代入する場合、結果の型はケース リストに依存します構造。 switch-case ステートメントで複数の case をリストすると、予期しない動作が発生する可能性があります。
指定したコード スニペット内:
switch a := foo.(type){ case B, A: a.test() }
変数 a の型がインターフェースであるため、エラーが発生します。{} A や B ではなく、A や B ではありません。これは、ケース リストに複数の型が含まれているため、a の型はインターフェイス式 (foo) の型と同じままであるためです。
解決するにはこれにより、ケース リストには 1 つの型のみが含まれる必要があります。
switch a := foo.(type){ case A: a.test() }
ケース リストを特定の型に制限することで、変数 a が期待される型になり、メソッド呼び出しが成功します。
代わりに、アサーション式を使用してインターフェイス タイプを明示的にアサートすることもできます。
if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() }
この場合、変数 a には期待される値のみが含まれます。アサーションが成功した場合 (つまり、ok が true の場合) を入力します。
以上がGo タイプのスイッチで複数のケースが予期しない動作を引き起こす可能性はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。