receive-only と、send-only な channel
Goのライブラリを見ていたら、
<-chan int
という宣言があることに気づいた。
試して分かったのだが、これは、受信専用のチャネルということらしい。
rcvc := make(<-chan int); rcvc <- i // invalid operation: rcvc <- 1 (send to receive-only type <-chan int)
送信専用チャネルもできる。
sndc := make(chan<- int); <-sndc // invalid operation: <-sndc (receive from send-only type chan<- int)
けど、上のやつみたいに、受信専用、送信専用のチャネルを、make で作ることはないんじゃないかと。
(なんか、自分の知らないテクニックとかあるのかもしれないけど。)
下のように、送受信可能なチャネルを作って、受信専用、送信専用のそれぞれの場所に割り当てるのが基本かと。
origin := make(chan int); var rcvc <-chan int = origin; var sndc chan<- int = origin;
つまり、チャネルをどう使えばよいかを、明示するのが大きな役割。
例えば、http://golang.org/pkg/time/#Tick time.Tick はこんなインタフェースになっている。
func Tick(ns int64) <-chan int64
これは、戻り値のチャネルは受信専用だということを言っている。
つまり、こんな感じに使ってくれといっている。
package main import "time" func main() { tick := time.Tick(1 * 1000 * 1000 * 1000); for { <-tick; } }