Considérez le code Go suivant :
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.") }
La première assertion de type fonctionne lorsqu'elle est explicitement déclarer le type comme func(int) bool. Cependant, le second utilisant l'alias de type quelque choseFuncy panique.
Contrairement au casting, les assertions de type dans Go comparent strictement le type réel de la valeur affirmée. Par conséquent, l'alias de type quelque choseFuncy, bien que partageant la même signature que func(int) bool, est considéré comme un type distinct.
L'assertion de type est effectuée dans le code suivant, qui simplement compare les types pour l'égalité :
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 } }
Cette comparaison échoue lors de l'utilisation de l'alias de type car elle nécessite un type exact match.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!