1. ホーム
  2. concurrency

関数の引数としてチャンネルを渡すさまざまな方法

2023-08-31 03:11:49

質問

私はいくつかのgoのコードを読んでいて、goチャンネルを渡すためにいくつかの異なる方法を述べています。多分、それらは同じですが、私はオンラインでドキュメントを見つけることができなかったので、違いがあるのかどうか疑問に思っていました。

1)

func serve(ch <-chan interface{}){ //do stuff }

2)

func serve(ch chan<- interface{}){ //do stuff }

3)

func serve(ch chan interface{}){ //do stuff }

4)

func server(ch *chan interface{}){ //do stuff}

私は、これらの違いは何なのか、そして、異なるゴルーチン間でチャネルを渡すという同じことをするための同等の方法であるのかどうか疑問に思っていました。

注: チャンネル、マップ、スライス、または関数値へのポインターを渡す理由がないことは承知しています。なぜなら、これらはすべて内部にポインターを含む参照型だからです (例外は、呼び出し側が参照型ヘッダーを変更したい場合です)。私がそれを提供した唯一の理由は、完全性のためです(つまり、チャンネルがパラメータとして渡されることを試みることができるあらゆる方法を実際に提供し、これを行うすべての方法を参照し、それらを比較することを望む質問について作成するためです)。

どのように解決するのですか?

これらは、異なる タイプ のチャンネルです。参照 http://golang.org/ref/spec#Channel_types . ポインタの件。一般的ではありませんが、関数内部からチャンネルを変更したい場合に便利かもしれません(実際に見たことはありません)。