Passer des cartes par valeur ou par pointeur dans Go
Dans Go, passer par valeur et par pointeur peut prêter à confusion, surtout lorsqu'il s'agit de types de cartes. Cet article aborde le problème de l'indexation d'une carte passée par pointeur, qui entraîne des erreurs de compilation.
Le problème
Lorsque l'on tente de passer une carte par pointeur et de modifier sa valeurs, Go génère une erreur indiquant que le type ne prend pas en charge l'indexation. En effet, l'indexation sur un pointeur n'est pas prise en charge pour les cartes.
La solution
Pour éviter cette erreur, déréférencez le pointeur avant d'indexer la carte. Au lieu de b[amount.Currency], utilisez (*b)[amount.Currency].
Discussion supplémentaire
Par défaut, les types simples comme les entiers sont transmis par valeur, tandis que les structures et les interfaces sont transmises par référence. Toutefois, ce n’est pas le cas pour les cartes. Les cartes sont transmises par référence par défaut, donc les transmettre par valeur ou par pointeur est essentiellement la même chose.
Dans l'exemple ci-dessus, l'utilisation d'un récepteur de pointeur pour la méthode Add n'est pas nécessaire car la carte est déjà passée par référence. La méthode pourrait s'écrire comme suit sans aucune perte de fonctionnalité :
func (b Balance) Add(amount Amount) Balance { current, ok := b[amount.Currency] if ok { b[amount.Currency] = current + amount.Value } else { b[amount.Currency] = amount.Value } return b }
En résumé, lorsque l'on travaille avec des cartes, il n'est pas nécessaire de les passer par pointeur pour éviter la copie. Le passage par valeur permet d'obtenir le même résultat sans avoir besoin de déréférencer.
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!