Dans Go, les arguments de la fonction sont transmis par valeur, ce qui signifie que toute modification apportée aux arguments dans la fonction n'affecte pas l'original valeurs en dehors de la fonction. Cela peut prêter à confusion lorsqu'il s'agit de structures, car vous pouvez vous attendre à ce qu'elles soient transmises par référence.
Pour comprendre comment cela fonctionne, considérez l'extrait de code suivant :
package main import ( "fmt" "runtime" ) type Something struct { number int queue chan int } func gotest(s *Something, done chan bool) { fmt.Printf("from gotest:\n&s: %p\n", &s) for num := range s.queue { fmt.Println(num) s.number = num } done <- true } func main() { runtime.GOMAXPROCS(4) s := &Something{number: 42} fmt.Printf("&s: %p\n", &s) s.queue = make(chan int) done := make(chan bool) go gotest(s, done) s.queue <- 43 close(s.queue) <-done fmt.Printf("&s: %p\n", &s) fmt.Println(s.number) // Output: 43 }
Ce code démontre passer un pointeur de structure par valeur. Dans la fonction principale, nous créons une instance de Something et passons un pointeur vers celle-ci à la fonction gotest.
Dans la fonction gotest, nous modifions le champ numérique de la structure et transmettons également des messages à son canal de file d'attente. La fonction gotest opère sur une copie du pointeur, donc toute modification qu'elle apporte n'affectera pas la structure d'origine dans la fonction principale.
En utilisant l'expression &s, nous pouvons observer les valeurs du pointeur à différentes étapes d'exécution. Le résultat montre que :
Ce comportement est cohérent avec la sémantique de passage par valeur de Go, où les arguments sont copiés dans la portée de la fonction. Par conséquent, si vous souhaitez modifier la structure d'origine, vous devez lui passer un pointeur plutôt que la structure elle-même.
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!