Initialisation de valeur dans Go
Dans Go, utiliser & pour initialiser une valeur plutôt que d'utiliser new() peut sembler être des approches différentes, mais leur la fonctionnalité est essentiellement la même.
Illustrer l'équivalence
Considérez les extraits de code suivants :
v := &Vector{}
et
v := new(Vector)
Ici, Vector représente un type personnalisé. Les deux approches allouent de la mémoire pour la structure Vector et renvoient un pointeur vers la mémoire allouée.
Pour démontrer cette équivalence, comparons les types résultants :
package main import "fmt" import "reflect" type Vector struct { x int y int } func main() { v := &Vector{} x := new(Vector) fmt.Println(reflect.TypeOf(v)) fmt.Println(reflect.TypeOf(x)) }
Sortie :
*main.Vector *main.Vector
Comme cela est évident, les deux méthodes génèrent des pointeurs vers le vecteur type.
Contexte historique et préférences
Bien que les deux méthodes obtiennent le même résultat, leurs historiques respectifs peuvent influencer les préférences des développeurs. new() a été introduit plus tôt dans le développement de Go et était le seul moyen d'initialiser des pointeurs vers des types de base comme les entiers. Depuis lors, & a été ajouté comme approche plus générale qui fonctionne pour tout type.
Conclusion
En fin de compte, le choix entre & et new() est une question de préférence. Les deux approches allouent de la mémoire et renvoient un pointeur vers la mémoire allouée, ce qui donne une fonctionnalité identique.
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!