Golang で「非インターフェイス値ではスイッチを入力できません」というエラーが発生するのはなぜですか?

Susan Sarandon
リリース: 2024-11-13 04:40:02
オリジナル
901 人が閲覧しました

Why Do I Get the

エラー: Golang の「非インターフェイス値でスイッチを入力できません」

型アサーションを使用する場合、エラー「」が発生することがあります。 switch on 非インターフェイス値を入力できません。」これは、インターフェイスではない値に対して型切り替えを実行しようとすると発生します。

Golang では、型切り替えにより、変数の型に基づいて条件付きでコードを実行できます。ただし、変数がインターフェイス型である必要があります。インターフェイスは、実装型が実装する必要があるメソッドのセットを定義するコントラクトを表します。

提供されたコード スニペットでは、Stringer という名前の型が 1 つの String() メソッドで定義されています。 Number 型は String() メソッドも実装しており、Stringer インターフェイスの具体的な実装となります。

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}
ログイン後にコピー

ただし、n 変数で型の切り替えが試行される main 関数でエラーが発生します。これは Stringer ではなく *Number 型です。

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
ログイン後にコピー

この問題を解決するには、型アサーションを実行する前に n を Interface{} にキャストする必要があります。これは、interface{} が任意の値を表すことができるためです。

func main() {
    n := &Number{1}
    switch v := interface{}(n).(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}
ログイン後にコピー

n をinterface{} にキャストすると、基本的に、型スイッチが n が Stringer 型である可能性を考慮できるようになります。型スイッチを入力すると、n の実際の型が決定され、適切な case ブランチが実行されます。

以上がGolang で「非インターフェイス値ではスイッチを入力できません」というエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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