ホームページ  >  記事  >  バックエンド開発  >  Go ではチャネルは値または参照によって渡されますか?

Go ではチャネルは値または参照によって渡されますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-25 22:30:12939ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。