Maison > développement back-end > Golang > le corps du texte

Impossible d'utiliser l'assertion de type sur la valeur du paramètre de type

PHPz
Libérer: 2024-02-09 21:42:09
avant
670 Les gens l'ont consulté

Impossible dutiliser lassertion de type sur la valeur du paramètre de type

En programmation PHP, l'assertion de type est une technique courante utilisée pour déterminer le type d'une variable. Cependant, nous pouvons parfois rencontrer un problème : les assertions de type ne peuvent pas être utilisées sur les valeurs des paramètres de type. Cette question peut dérouter certains développeurs. Dans cet article, nous explorerons les causes de ce problème et proposerons quelques solutions. Que nous soyons développeurs débutants ou expérimentés, en comprenant et en résolvant ce problème, nous pouvons mieux comprendre et utiliser les assertions de type. Nous allons jeter un coup d'oeil!

Contenu de la question

Nous ne pouvons pas utiliser d'assertions de type sur des variables de type génériques. Cela semble étrange étant donné qu'il s'agit du comportement générique de la contrainte interface{} 允许的,但不受 interface{}. Vous vous demandez s'il existe des solutions de contournement ?

// This works
func isInt(x interface{}) bool {
    _, ok := x.(int)
    return ok;
}

// Compile Error
// invalid operation: cannot use type assertion on type parameter 
// value x (variable of type T constrained by interface{})
func isInt2[T interface{}](x T) bool {
    _, ok := x.(int)
    return ok;
}
Copier après la connexion

Solution

tl;dr

Vous ne pouvez effectuer des assertions de type que sur les valeurs de l'interface. Par conséquent, vous devez d'abord convertir x 转换为有效的接口类型,在本例中为 any / interface{} : 

func isint[t any](x t) (ok bool) {

    _, ok = any(x).(int) // convert, then assert
    return
}
Copier après la connexion

Alors pourquoi cette compilation échoue ?

_, ok = x.(int)   // ... cannot use type assertion on type parameter value ...
Copier après la connexion

x 的类型 t 是一个类型参数,而不是一个接口。它仅受接口约束。 go(修订版 1.18) La spécification du langage indique clairement que les paramètres de type ne sont pas autorisés dans les assertions de type :

Pour type d'interface mais pas expression de type x Les paramètres et le type t ...符号 x.(t) sont appelés assertions de type.

Également à partir du Tutoriel génériques, découvrez pourquoi les types de paramètres doivent être résolus au moment de la compilation :

Bien que les contraintes sur les paramètres de type représentent généralement un ensemble de Tapez, au moment de la compilation, le paramètre type représente un type unique – Le type fourni par le code appelant en tant que paramètre de type. si tapez Le type du paramètre n'est pas autorisé par les contraintes du paramètre type, Le code ne peut pas être compilé.

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal