ホームページ > バックエンド開発 > Golang > Go で複数のケースを含む型を切り替えると「未定義」メソッド エラーが発生するのはなぜですか?

Go で複数のケースを含む型を切り替えると「未定義」メソッド エラーが発生するのはなぜですか?

Patricia Arquette
リリース: 2024-12-18 14:42:09
オリジナル
135 人が閲覧しました

Why Does a Type Switch with Multiple Cases in Go Result in an

Go での複数のケースを使用した型スイッチ

Go では、型スイッチを使用して、値を複数の型と照合できます。ただし、型の切り替えで複数のケースを使用する場合、変数の型の割り当てを理解することが重要になります。

次のコード スニペットを検討してください。

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()
    }
}
ログイン後にコピー

このコードを実行すると、エラーが発生します。 .test 未定義 (タイプ インターフェイス {} はメソッドのないインターフェイスです)。このエラーは、型の切り替えにもかかわらず、変数 a が型インターフェイス{}を保持するために発生します。

この動作を理解するには、Go 仕様を参照する必要があります。

「TypeSwitchGuard には次のものが含まれる場合があります」短い変数宣言。その形式が使用される場合、変数は各節の暗黙的なブロックの先頭で宣言されます。case が 1 つの型のみをリストする節では、変数はその型を持ちます。 "

この場合、case 句で複数の型 (B と A) が指定されているため、変数 a は TypeSwitchGuard の式の型 (interface{) を保持します。 }。これは、interface{} に test() メソッドがないため、コンパイラが a で test() メソッドを呼び出すことを許可しないことを意味します。

これを解決するには、型アサーションを使用できます。値が特定の型を持つことを主張します。型アサーションを使用するコードの更新バージョンは次のとおりです:

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 = &B{}
    if a, ok := foo.(tester); ok {
        fmt.Println("foo has test() method")
        a.test()
    }
}
ログイン後にコピー

以上がGo で複数のケースを含む型を切り替えると「未定義」メソッド エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート