ホームページ >バックエンド開発 >Golang >Go タイプのスイッチで複数のケースが予期しない動作を引き起こす可能性はありますか?

Go タイプのスイッチで複数のケースが予期しない動作を引き起こす可能性はありますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-01 06:35:11906ブラウズ

How Can Multiple Cases in Go Type Switches Lead to Unexpected Behavior?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。