考慮以下 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。然而,使用型別別名 someFuncy 的第二個會出現恐慌。
與強制轉換不同,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中文網其他相關文章!