Maison >développement back-end >Golang >Les canaux sont-ils transmis par valeur ou par référence dans Go ?

Les canaux sont-ils transmis par valeur ou par référence dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-25 22:30:12964parcourir

Are Channels Passed by Value or Reference in Go?

Les canaux sont-ils transmis par référence par défaut ?

Dans Go, la fonction intégrée make crée des instances de tranches, de cartes et de canaux . Ces types ne sont pas directement passés par référence, mais se comportent techniquement comme tels en raison de l'allocation de mémoire sur le tas lors de leur initialisation.

L'exemple de canal suivant démontre ce comportement :

package main

import "fmt"

func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    c <- sum
}

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

    fmt.Println(x, y, x+y)
}

Dans cet exemple, le canal c est initialisé à l'aide de make, créant un comportement de type référence. Toutes les modifications apportées à c dans la fonction sum persistent après la fin de la fonction.

Ce comportement est expliqué plus en détail dans la spécification Go :

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). La mémoire est initialisée comme décrit dans la section sur l'initialisation valeurs.上是按值传递的。这使得它们可以传递给函数并允许写入或读取,类似于指针的行为。

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn