ホームページ  >  記事  >  バックエンド開発  >  Go が「非インターフェイス値ではスイッチを入力できません」というエラーをスローするのはなぜですか?

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

DDD
DDDオリジナル
2024-11-17 11:37:02874ブラウズ

Why Does Go Throw a

Go の型アサーション: 「非インターフェイス値でスイッチを入力できない」の解決

Go では、型アサーションには値があるかどうかのチェックが含まれます特定のタイプに属します。 「非インターフェイス値ではスイッチを入力できません」というエラーが発生した場合は、チェックされている値がインターフェイスではないことを意味します。

次のコードを検討してください。

type Stringer interface {
    String() string
}

type Number struct {
    v int
}

func (number *Number) String() string {
    return strconv.Itoa(number.v)
}

func main() {
    n := &Number{1}
    switch v := n.(type) {
    case Stringer:
        fmt.Println("Stringer:", v)
    default:
        fmt.Println("Unknown")
    }
}

このコードは、次のことを試みます。を入力して値 n (*Number 型) をオンにします。ただし、「非インターフェイス値では型を切り替えることができません」というエラーが発生します。

これを解決するには、型アサーションを実行する前に n をインターフェイス値にキャストする必要があります。これは、タイプの切り替えはインターフェイス値に対してのみ実行できるためです。次の修正されたコードは、これを示しています。

switch v := interface{}(n).(type) {
case Stringer:
    fmt.Println("Stringer:", v)
default:
    fmt.Println("Unknown")
}

n をインターフェイス{}にキャストすることで、結果のインターフェイス値に対して型の切り替えを実行できるようになります。これにより、n が Stringer 型であるかどうかを正常にチェックし、対応するメッセージを出力できるようになります。

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

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