我正在努力了解 Go 的频道。我想我了解基本的双向chan但我在理解<-chan和chan<-.
我希望它们对于以一种方式与线程进行通信很有用,但我在线程实际读取和接收值时遇到了问题。
package main
import (
"fmt"
"time"
)
func Thread(c chan<- int) {
for {
num := <-c
fmt.Println("Thread : ", num)
time.Sleep(time.Second)
}
}
func main() {
c := make(chan<- int, 3)
go Thread(c)
for i := 1; i <= 10; i++ {
c <- i
}
for len(c) > 0 {
time.Sleep(100)
}
}
我试过使用<-chan而不是chan<-inmake()但同样的事情发生了:
C:\>go run chan.go
# command-line-arguments
.\chan.go:10: invalid operation: <-c (receive from send-only type chan<- int)
如果我无法从频道中读取,何必写信呢?带着这个想法,我想我一定是做错了什么。我期望chan只发送意味着一个线程只能发送而另一个线程只能接收。情况似乎并非如此。
如果我<-完全删除它,它会起作用,但这将使其双向允许 go 例程响应(即使它从未响应),我希望避免这种情况。似乎我可以将数字排除chan在我永远无法读取的数字中,或者我可以从chan无法写入的数字中读取。
我希望做的是将整数从主线程发送到 go 例程,以便它使用单向通道进行打印。我究竟做错了什么?
如果重要的话,这是 Windows 上的 go 1.3.3。更新到 1.4 没有帮助。我可能想提一下这也是 x64。
相关分类