這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport("io""fmt""log""net")const listenaddr="0.0.0.0:4000"var partner=make(chan io.ReadWriteCloser)func match(c io.ReadWriteCloser){fmt.Fprintln(c,"wait for partner...")select{case partner<-c://do nothingcase p := <-partner:chat(c,p)}}func chat(a,b io.ReadWriteCloser){fmt.Fprintln(a,"yes,i got a partner...")fmt.Fprintln(b,"yes,i got a partner...")go io.Copy(a,b)io.Copy(b,a)}func main(){l,err:= net.Listen("tcp",listenaddr)if err!=nil {log.Fatal(err)}for {c,err := l.Accept()if err!=nil {log.Fatal(err)}go match(c)}}
A select blocks until one of its cases can run, then it executes that case. It chooses one at random if multiple are ready.
http://tour.golang.org/#64
By default, sends and receives block until the other side is ready. This allows goroutines to synchronize without explicit locks or condition variables.
var partner=make(chan io.ReadWriteCloser,1)
buffed channels only full block.