相关疑难解决方法(0)

多个goroutines在一个频道上收听

我有多个goroutines尝试同时在同一个频道上接收.似乎在频道上开始接收的最后一个goroutine获得了价值.这是语言规范中的某个地方还是未定义的行为?

c := make(chan string)
for i := 0; i < 5; i++ {
    go func(i int) {
        <-c
        c <- fmt.Sprintf("goroutine %d", i)
    }(i)
}
c <- "hi"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)

输出:

goroutine 4
Run Code Online (Sandbox Code Playgroud)

在操场上的示例

编辑:

我才意识到这比我想象的要复杂得多.消息在所有goroutine周围传递.

c := make(chan string)
for i := 0; i < 5; i++ {
    go func(i int) {
        msg := <-c
        c <- fmt.Sprintf("%s, hi from %d", msg, i)
    }(i)
}
c <- "original"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)

输出:

original, hi from 0, hi from 1, hi from …
Run Code Online (Sandbox Code Playgroud)

go

65
推荐指数
4
解决办法
5万
查看次数

是否有"制造"单向通道的目的?

注意:这不是这个问题的重复,因为我知道你什么时候会使用单向通道.我一直这样做.我的问题是为什么这个程序是有效的:

func main() {
    ch := make(chan<- int)
    ch <- 5
    fmt.Println("Hello, playground")
}
Run Code Online (Sandbox Code Playgroud)

操场

当然,运行它会造成僵局.如果您使用%T检查类型,则Go确实报告类型ch是仅发送通道.在Go中,你被允许使用make单向通道,但它没有多大意义,因为通过创建一个只有单向通道的通道,你可以确保至少有一个读/写永远不会发生.

一个可能的解释是强制goroutine挂起,但这很容易实现select {}.

我唯一的另一个想法是强迫goroutine只做一些事情n,

ch := make(chan<- int, 50)
// do something 50 times, since then the buffer is full
for {
  ch <- doSomething()
}
Run Code Online (Sandbox Code Playgroud)

但是,通过任意数量的不同结构,这更容易,更不用说容易混淆了.

这只是对类型系统的怪癖/疏忽,还是有用于我没想到的这种行为?

go

13
推荐指数
1
解决办法
222
查看次数

在 Go 中创建单向通道有什么意义

在 Go 中,可以创建单向通道。如果您想限制给定频道上可用的一组操作,这是一个非常方便的功能。然而,据我所知,这个特性只对函数的参数和变量的类型规范有用,而通过创建单向通道make对我来说看起来很奇怪。我读过这个问题,但这不是关于在 Go 中创建只读(或写)通道,而是关于一般用法。所以,我的问题是关于下一个代码的用例:

writeOnly := make(chan<- string)
readOnly := make(<-chan string)
Run Code Online (Sandbox Code Playgroud)

channel go

5
推荐指数
1
解决办法
752
查看次数

标签 统计

go ×3

channel ×1