Go では、共有動作を持つ型を処理するためにインターフェイスを使用するのが一般的です。ただし、型アサーションを使用してインターフェイス値の型を頻繁にチェックするのは面倒になる可能性があります。ここで次のような疑問が生じます:
たとえば、インターフェイスを取る関数を考えてみましょう:
func method(data interface{})
具体的な型のフィールドまたはメソッドにアクセスするには、通常、型アサーションを使用します:
switch data.(type) { case *Struct1: a := data.(*Struct1) // ... case *Struct2: a := data.(*Struct2) // ... }
ただし、Go の静的型付けシステムでは、実行時に特定の型の変数を作成できません。
機能の抽象化:
型アサーションに依存する代わりに、必要な機能を定義するインターフェイスを作成します。次に、具象型にこのインターフェイスを実装させます。インターフェイス値をこの型の変数に割り当て、型アサーションの必要性を排除します。
リフレクションの使用:
抽象化が不可能な場合、リフレクションは次のように行うことができます。名前によって共通フィールドにアクセスするために使用されます。このソリューションでは動的な型処理が可能ですが、コンパイル時の保証がなく、パフォーマンスに影響を与える可能性があります。
以上がGo で型アサーションを回避できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。