首頁 > 後端開發 > Golang > 主體

Go 中通道是按值傳遞還是按引用傳遞?

Barbara Streisand
發布: 2024-11-25 22:30:12
原創
938 人瀏覽過

Are Channels Passed by Value or Reference in Go?

預設情況下通道是透過引用傳遞的嗎?

Go 中,內建函數 make 建立切片、貼圖和頻道的實例。這些類型不是直接透過引用傳遞,但從技術上講,由於在初始化期間在堆上分配了內存,因此表現出這樣的行為。

以下通道範例示範了此行為:

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)
}
登入後複製

在此範例中,通道 c 使用 make 進行初始化,從而建立類似引用的行為。 sum 函數中對 c 所做的任何變更在函數終止後都會保留。

Go 規範中進一步解釋了此行為:

內建函數 make 採用類型 T,它必須可以是切片、映射或通道類型,可以選擇後跟特定於類型的表達式列表。它傳回 T 類型的值(不是 *T)。記憶體按照初始值部分中的描述進行初始化。

因此,切片、映射和通道可以被視為引用類型,儘管它們在技術上是按值傳遞的。這使得它們可以傳遞給函數並允許讀取或讀取,輔助指標的行為。

以上是Go 中通道是按值傳遞還是按引用傳遞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板