これは機能します。
var tick <-chan time.Time = time.Tick(1e8)
ただし、そうではありません。
var tick chan time.Time = time.Tick(1e8)
<-
チャネルの型宣言に が必要なのはなぜですか? <-
チャンネルへの書き込みまたはチャンネルからの読み取り用だと思いました。なぜそれがタイプに現れるのですか?
これは機能します。
var tick <-chan time.Time = time.Tick(1e8)
ただし、そうではありません。
var tick chan time.Time = time.Tick(1e8)
<-
チャネルの型宣言に が必要なのはなぜですか? <-
チャンネルへの書き込みまたはチャンネルからの読み取り用だと思いました。なぜそれがタイプに現れるのですか?
チャネルは、読み取り専用、書き込み専用、またはその両方であるかを示すタイプを持つことができます。
チャネルの方向を示すには、型の一部として <- を使用するか、読み取り/書き込みチャネルの場合は省略します。
in<-
は<-chan time.Time
型の一部です
chan time.Time //Would be a read/writable channel
chan<- time.Time // Would be a write only channel
<-chan time.Time // Would be a read only channel
読み取り専用チャネルをtime.Tick(1e8)
返します。
言語仕様の詳細はこちら
チャネルは、端が 2 つあるパイプと考えるとよいでしょう。一方の端はイベントが流入する場所であり、もう一方の端はイベントが流出する場所です。したがって、チャネルを宣言します。
var c = make(chan int)
全体としてチャネルを作成します。つまり、両端でチャネルを作成します。逆に、
func consume(c <-chan int) {
...
}
チャネル入力パラメータ (つまり、読み取り可能なチャネルの終わり) を持つ関数を定義し、
func generate(c chan<- int) {
...
}
チャネル出力パラメータ (つまり、チャネルの書き込み可能な終端) を持つ関数を定義します。これらの関数はどちらも、チャネル全体を実際のパラメーターとして渡すことも、必要な末尾のみを渡すこともできます。
チャネルがローカル変数または構造体のフィールドとして使用される場合も、同じ一般原則が適用されます。
可能な限り channel-end 構文を使用することをお勧めします。コンパイラは、意図したとおりに記述したことをより徹底的にチェックできるからです。
興味深いことに、occam プログラミング言語にも、チャネルのどちらの端がどちらであるかを示す同等の構文があります。