Go permet de transmettre des paramètres via des pointeurs (parfois appelés références) et des valeurs. Dans cet article, nous comparerons les deux approches, en accordant une attention particulière aux différents contextes qui peuvent influencer le choix.
Passage de pointeur et passage de valeur
À proprement parler, il n'y a qu'une seule méthode de passage pour les méthodes ou fonctions go, que c'est juste un passage par valeur. Chaque fois qu'une variable est passée en argument, une nouvelle copie de la variable est créée et transmise à la fonction ou à la méthode appelée. Les copies sont allouées à différentes adresses mémoire.
Dans le cas du passage d'une variable par pointeur, une nouvelle copie sera créée pointant vers la même adresse mémoire. Pour avoir une idée de la différence, voyons comment cela fonctionne.
Valeur transmise
package main import "fmt" type Person struct { firstName string lastName string } func changeName(p Person) { p.firstName = "Bob" } func main() { person := Person { firstName: "Alice", lastName: "Dow", } changeName(person) fmt.Println(person) }
L'exécution du code vous donnera le résultat suivant :
{Alice Dow}
Notez que même si la fonction changeName change firstName en "Bob ", Le changement n'affectera pas la variable personne dans la fonction principale. Cela se produit parce que la fonction changeName modifie une copie de la variable person, et non la personne elle-même.
Passage du pointeur
package main import "fmt" type Person struct { firstName string lastName string } func changeName(p *Person) { p.firstName = "Bob" } func main() { person := Person { firstName: "Alice", lastName: "Dow", } changeName(&person) fmt.Println(person) }
L'exécution du code obtiendra le résultat suivant :
{Bob Dow}
Dans ce cas, la variable person dans la fonction main est modifiée en la fonction changeName a été modifiée. Cela se produit parce que &person et p sont deux pointeurs différents vers la même structure stockée à la même adresse mémoire.
Les variables ne peuvent pas être modifiées
Nous n'avons pas d'autre choix que de passer par valeur. Cette variable ne peut donc pas être modifiée en aval. Vice versa, si une variable doit être modifiée, elle doit être passée via un pointeur.
La variable est une grande structure
Si la variable est une grande structure et que les performances sont un problème, il est préférable de passer la variable par pointeur. Cela évite de copier toute la structure en mémoire.
La variable est une carte ou une tranche
La carte et la tranche dans Go sont des types de référence et doivent être transmises par valeur.
Le passage par valeur est généralement moins cher
Même si Go ressemble un peu au C, son compilateur fonctionne différemment. L'analogie de C ne fonctionne pas toujours avec Go. Passer par valeur peut être moins coûteux que passer par pointeur dans Go. Cela se produit parce que Go utilise l'analyse d'échappement pour déterminer si la variable peut être allouée en toute sécurité sur le cadre de pile de la fonction, ce qui peut être beaucoup moins coûteux que l'allocation de la variable sur le tas. Le passage par valeur simplifie l'analyse d'échappement dans Go et offre de meilleures opportunités d'affectation pour les variables.
Résumé
La différence entre le passage de pointeur et le passage de valeur
1. est une adresse, pas les données contenues dans l'adresse. Il transfère moins de données et est plus efficace que le transfert de valeur. En général, les pointeurs peuvent être utilisés à la place des transferts de valeur.
2. Lorsque le pointeur est passé, la modification des données spatiales pointées par le pointeur dans la fonction appelante affectera l'appelant. Parce qu'elles pointent vers la même zone, le transfert du pointeur n'affectera pas celui de l'appelant. données.
Recommandations associées : tutoriel golang
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!