Go での型アサーション: 「非インターフェイス値でスイッチを入力できない」エラーを解決する
Go で型アサーションを使用する場合、 「非インターフェイス値にスイッチを入力できません」というエラーが発生する可能性があります。カスタム タイプを使用した例を使用して、これが何を意味し、どのように解決するかを詳しく見てみましょう。
次のコード スニペットを考えてみましょう。
package main import "fmt" import "strconv" 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 構造体へのポインタです。
解決策は、型アサーションを試行する前に値をインターフェイスにキャストすることです。{}これは、型アサーションはインターフェイス値に対してのみ実行できるためです。修正されたコードは次のとおりです:
func main() { n := &Number{1} switch v := interface{}(n).(type) { case Stringer: fmt.Println("Stringer:", v) default: fmt.Println("Unknown") } }
これで、コードを実行すると、「Stringer: 1」が出力されます。これは、n を Interface{} にキャストすると、型アサーションのインターフェイス値として扱うことができるためです。
以上がGo のタイプ アサーション: 「非インターフェイス値でスイッチを入力できない」理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。