Les canaux sont-ils transmis par référence ?
Le langage Go introduit des canaux pour la concurrence, qui sont comme des tuyaux de communication entre les goroutines. Le comportement des canaux a soulevé des questions concernant leur mécanisme de passage.
Considérons l'exemple de la tournée Go pour les canaux :
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, un canal c est partagé entre deux goroutines, chacune exécutant la fonction somme. Les modifications apportées au canal dans la fonction sont observées dans la routine principale. Ce comportement suggère que les canaux sont transmis par référence.
La raison technique de ce comportement réside dans la manière dont les canaux sont initialisés et utilisés. La fonction make alloue de la mémoire sur le tas, créant ainsi un pointeur, bien qu'il ne soit pas exposé au programmeur. Ce pointeur est affecté à la variable de canal, lui permettant d'être traitée comme un type référence.
La spécification du langage Go confirme ce comportement :
"La fonction intégrée make prend un type T , qui doit être un type de tranche, de carte ou de canal, éventuellement suivi d'une liste d'expressions spécifiques au type. Il renvoie une valeur de type T (et non *T)."
Par conséquent, les canaux dans Go sont implicitement passé par référence. Cela permet une communication efficace entre les goroutines et simplifie les mécanismes de synchronisation.
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!