如何使用 <-chan 和 chan<- 进行定向通信?

我正在努力了解 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。


小怪兽爱吃肉
浏览 391回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go