Go の型スイッチでの複数のケースの処理
型スイッチは、Go でインターフェイス値の型を切り替える方法を提供します。ただし、型スイッチで複数のケースを処理しようとすると、インターフェイスにメソッドがないために特定のメソッドが定義されていないことを示すエラーが発生する可能性があります。これは、インターフェイス値の type switch 式の後に複数の case 句が続く場合に発生する可能性があります。
たとえば、次のコードを考えてみましょう。
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() } }
このコードを実行するとエラーが発生します。 :
panic: interface conversion: interface {} is interface with no methods
このエラーは、複数の case 句を含む型スイッチが TypeSwitchGuard の式の型を各句の変数に割り当てるために発生します。 foo は typeinterface{} を持つため、foo の実際の基礎となる型に関係なく、どちらの場合も a も typeinterface{} を持ちます。これにより、インターフェイスには、スイッチで想定されていた test() メソッドを含むメソッドが存在しなくなります。
この問題を解決するには、型を使用して foo に目的のメソッドがあることをアサートできます。主張。値がインターフェイスを実装している場合、型アサーションはインターフェイス値を特定の型に効果的に変換します。一般的なアプローチは、必要なメソッドを定義する新しい型を作成することです:
type tester interface { test() }
次に、switch ステートメントで、foo がインターフェイスを満たすかどうかを確認し、そのメソッドにアクセスする前に適切な型に変換します。
if a, ok := foo.(tester); ok { fmt.Println("foo has test() method") a.test() }
型アサーションを使用すると、基になる型に共通のメソッドがない場合でも、型の切り替えで複数のケースを処理でき、正しいメソッドが確実に呼び出されます。 foo の実際の型。
以上が「メソッドのないインターフェイス」エラーを発生させずに、Go タイプのスイッチで複数のケースを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。