En programmation, il est courant de rencontrer des situations où vous devez taper affirmer une tranche de valeurs d'interface. Cependant, cela peut parfois conduire à des erreurs. Examinons les raisons pour lesquelles l'affirmation d'une tranche de valeurs d'interface n'est pas toujours réalisable.
Lorsque vous essayez de taper assert sur un type spécifique, tel que []Symbol, à partir d'une tranche de valeurs d'interface, []Node , comme dans l'exemple fourni :
args.([]Symbol)
Vous pouvez rencontrer l'erreur suivante :
invalid type assertion: args.([]Symbol) (non-interface type []Node on left)
Cette erreur se produit car un slice, comme []Node, n'est pas un type d'interface, contrairement à Node lui-même. Une tranche possède son propre type distinct avec son propre ensemble de comportements et de méthodes. Par conséquent, il lui manque la fluidité et l'adaptabilité d'une interface, qui permet au type sous-jacent de changer de manière dynamique.
Bien qu'il puisse sembler pratique de traiter une tranche de valeurs d'interface comme une interface, cela viole fondamentalement le concept de typage. . Dans l'exemple ci-dessus, l'intention est de convertir les arguments de la tranche en une tranche de valeurs de symboles. Cependant, étant donné que args est une tranche de valeurs de nœud, une assertion de type simple ne peut pas être effectuée.
Pour gérer correctement cette situation, vous pouvez utiliser une approche alternative :
symbols := make([]Symbol, len(args)) for i, arg := range args { symbols[i] = arg.(Symbol) }
Ce code crée une nouvelle tranche de valeurs de symboles, de symboles et parcourt la tranche args, convertissant chaque élément en symbole à l'aide d'une assertion de type. Cette conversion manuelle garantit que chaque élément de la tranche résultante est conforme au type souhaité, fournissant la fonctionnalité souhaitée sans avoir besoin d'assertions de type invalides.
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!