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;
  }
}