我在http://tour.golang.org/的沙箱中运行此代码
我认为一旦我启动了覆盖通道的 goroutine,我将发送的所有值都会被打印出来。
package main
import "fmt"
func main() {
c := make(chan int)
go (func(c chan int){
for v := range c {
fmt.Println(v)
}
})(c)
c <- 1
c <- 2
c <- 3
c <- 4
// c <- 5 // uncomment to send more values
// c <- 6
close(c)
}
但是如果我发送奇数个值(比如 1、2 和 3),所有值都会被打印出来。
如果我发送偶数个值(例如 1、2、3 和 4),则不会打印最后一个值。
似乎频道创建行:
c := make(chan int)
当我添加不同大小的缓冲区时更改范围表达式的行为:
(我发送 4 个值)
c := make(chan int) // prints 1,2,3
c := make(chan int, 1) // same behavior, prints 1,2,3
c := make(chan int, 2) // prints 1,2
c := make(chan int, 3) // prints 1,2,3
c := make(chan int, 4) // [no output]
c := make(chan int, 5) // [no output]
c := make(chan int, 20) // [no output]
为什么我发送偶数时没有收到最后一个值?
更多内容:
我也离线测试了这个,在 64 位 Linux 下编译。
我稍微改变了程序:
package main
import (
"fmt"
)
func main() {
c := make(chan int)
cc := make(chan int)
p := func (c chan int){
for v := range c {
fmt.Println(v)
}
}
go p(c)
go p(cc)
c <- 1
c <- 2
c <- 3
c <- 4
// c <- 5
// c <- 6
cc <- 1000
// cc <- 2000
close(c)
close(cc)
}
如果我取消该行cc <- 2000
,那么所有内容都会被打印出来。但如果我把它注释掉,我只会得到 1、2 和 3。
好像是时间问题。我认为该行cc <- 1000
会阻塞主要功能,直到所有通道都被读取。