Transmission de référence implicite dans les canaux Go
Contrairement au comportement attendu de la copie de données, les canaux dans Go se comportent différemment. Considérez le code suivant, mentionné dans la documentation sur la concurrence de Go :
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum // send sum to c } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) }
Dans cet exemple, le canal c est modifié dans la fonction somme. Cependant, les modifications persistent une fois la fonction terminée. Cela suggère que le canal est transmis par référence. Cependant, aucun pointeur vers c n'a été explicitement créé.
Alors, la question se pose : les canaux sont-ils passés par référence implicitement dans Go ?
Réponse
Techniquement, les canaux ne sont pas transmis par référence. Au lieu de cela, Go fait une copie de la structure de données interne du canal. Cela permet une communication de données efficace entre les goroutines. Cependant, étant donné que la fonction make intégrée alloue de la mémoire sur le tas, le type de canal créé se comporte de la même manière qu'un type de référence.
Cela signifie que vous pouvez modifier le contenu du canal dans une fonction, et ces modifications seront toujours être visible pour la fonction appelante. Ainsi, les canaux peuvent être utilisés comme types de référence dans la programmation Go, offrant un moyen pratique de transmettre des données entre des goroutines exécutées simultanément.
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!