【发布时间】:2019-01-17 01:02:41
【问题描述】:
我对 golang 很陌生。今天在测试 Golang 中的通道如何工作时,我感到非常困惑。
根据教程:
仅当缓冲区已满时才发送到缓冲通道块。缓冲区为空时接收块。
我的测试程序如下所示:
package main
import "fmt"
func main() {
ch := make(chan int, 2)
go func(ch chan int) int {
for i := 0; i < 10; i++ {
fmt.Println("goroutine: GET ", <-ch)
}
return 1
}(ch)
for j := 0; j < 10; j++ {
ch <- j
fmt.Println("PUT into channel", j)
}
}
我得到这样的输出:
PUT into channel 0
PUT into channel 1
goroutine: GET 0
goroutine: GET 1
goroutine: GET 2
PUT into channel 2
PUT into channel 3
PUT into channel 4
PUT into channel 5
goroutine: GET 3
goroutine: GET 4
goroutine: GET 5
goroutine: GET 6
PUT into channel 6
PUT into channel 7
PUT into channel 8
PUT into channel 9
请注意,数字 2 是在放入频道之前从频道中获取的。为什么会这样?
【问题讨论】:
-
它没有。您的
Println("PUT into channel")发生在您将其放入通道之后,这意味着在执行该语句之前有机会从通道中读取它。 IE。您的读取是从/向通道写入的操作按预期顺序发生,只是您的打印语句似乎出现故障。 -
您关于发送到缓冲通道的问题与您使用的程序完全不同。
标签: go concurrency channel