我有一个结构叫做Hub
与Run()
方法,它在自己的goroutine中执行。该方法按顺序处理传入消息。消息从多个生产者同时到达(单独的goroutines)。当然,我使用channel
来完成这项任务。但是现在我想将Hub
隐藏在interface
之后,以便能够从其实现中进行选择。所以,使用channel
作为简单的Hub
的字段是不合适的。是否可以隐藏发送到函数调用后的通道
package main
import "fmt"
import "time"
type Hub struct {
msgs chan string
}
func (h *Hub) Run() {
for {
msg, hasMore := <- h.msgs
if !hasMore {
return
}
fmt.Println("hub: msg received", msg)
}
}
func (h *Hub) SendMsg(msg string) {
h.msgs <- msg
}
func send(h *Hub, prefix string) {
for i := 0; i < 5; i++ {
fmt.Println("main: sending msg")
h.SendMsg(fmt.Sprintf("%s %d", prefix, i))
}
}
func main() {
h := &Hub{make(chan string)}
go h.Run()
for i := 0; i < 10; i++ {
go send(h, fmt.Sprintf("msg sender #%d", i))
}
time.Sleep(time.Second)
}
所以我介绍了Hub.SendMsg(msg string)
功能只是调用h.msgs <- msg
和我可以添加到HubInterface
。作为一个Go
-我想知道,从并发的角度来看是否安全?如果是这样 - 在Go
这是一种常用的方法吗?
游乐场here。
是的。我不确定还有别的答案,因为我不确定什么会导致你相信它可能是不安全的。 – JimB
@JimB,实际上,在思考了一段时间后它是如何工作的,我意识到答案是非常明显的,只要写入通道是线程安全的。 –
_单通道可用于发送语句,接收操作以及通过任意数量的goroutine调用内置函数cap和len,而无需进一步同步。_另请参阅[如果我正确使用通道,则需要使用互斥?](http://stackoverflow.com/questions/34039229/if-i-am-using-channels-properly-should-i-need-to-use-mutexes) – icza