Go では、値を別のデータ型に変換するためにキャストが使用されます。ただし、型エイリアスを扱う場合は、次に示すように、少し異なるアプローチが必要です。
次のコードを考えてみましょう。
type somethingFuncy func(int) bool func funcy(i int) bool { return i%2 == 0 } var a interface{} = funcy func main() { _ = a.(func(int) bool) // Works _ = a.(somethingFuncy) // Panics }
ここでは、最初の型アサーション (_ = a.(func(int) bool)) は、a の値を関数型 func(int) bool に正常に変換します。ただし、2 番目のアサーション (_ = a.(somethingFuncy)) はパニックで失敗します。
パニックの理由は、Go の型アサーションの性質にあります。型アサーションの場合、値の実際の型のみが重要です。この場合、 a の型はinterface{}で、関数 funcy の値が割り当てられます。ただし、 somethingFuncy は、 func(int) bool と同じ関数シグネチャを共有しているにもかかわらず、別個の型エイリアスです。
Go では、型アサーションによって、値が特定の型であるかどうかが決まります。を入力し、存在する場合は、基になる値を抽出します。構文は x.(T) です。x は値、T はターゲットの型です。ここで重要なのは、ターゲットの型がエイリアスなしで x の型と正確に一致する必要があるということです。
残念ながら、そのような方法はありません。型アサーションを使用して、より長い関数シグネチャにキャストする直接的な方法。これは、型アサーションでは、他の型との互換性ではなく、値の正確な型のみが考慮されるためです。
Go では、異なるデータ型間で値を変換するために型キャストが不可欠ですが、型の別名を扱うときは、制限を理解することが重要です。型アサーションは型の正確な一致に依存しており、より長い関数シグネチャに対して値をアサートしようとすると、多くの場合パニックが発生します。
以上がGo で型エイリアスにキャストすると型アサーションがパニックになるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。