次の Go コードを考えてみましょう:
package main import "fmt" type somethingFuncy func(int) bool func funcy(i int) bool { return i%2 == 0 } func main() { var a interface{} = funcy _ = a.(func(int) bool) // Works fmt.Println("Awesome -- apparently, literally specifying the func signature works.") _ = a.(somethingFuncy) // Panics fmt.Println("Darn -- doesn't get here. But somethingFuncy is the same signature as func(int) bool.") }
最初の型アサーションは、明示的に動作する場合に機能します。型を func(int) bool として宣言します。ただし、型エイリアス somethingFuncy を使用する 2 番目の型はパニックになります。
キャストとは異なり、Go の型アサーションは、アサートされる値の実際の型を厳密に比較します。したがって、型エイリアス somethingFuncy は、func(int) bool と同じシグネチャを共有していますが、別個の型とみなされます。
型アサーションは次のコードで実行されます。型が等しいかどうかを比較します:
func main() { var a interface{} = funcy switch v := a.(type) { case func(int) bool: // Type successfully asserted as func(int) bool case somethingFuncy: // Type successfully asserted as somethingFuncy default: // Type assertion failed } }
型エイリアスを使用すると、正確な型が必要なため、この比較は失敗します。一致します。
以上がGo の型アサーションが型エイリアスを使用すると失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。