package main
import (
"fmt"
)
func main() {
c := make(chan int, 5)
c <- 5
c <- 6
close(c)
fmt.Println(<-c)
}
这段代码输出的结果为什么是 5 ?没太看明白
package main
import (
"fmt"
)
func main() {
c := make(chan int, 5)
c <- 5
c <- 6
close(c)
fmt.Println(<-c)
}
这段代码输出的结果为什么是 5 ?没太看明白
1
labulaka521 Oct 22, 2021
先进先出
5 进去了 6 进去了-> 5 出来了 6 出来了 |
2
dugoj Oct 22, 2021
类似先入先出的 FIFO 队列,你再 print 一下就是 6 了,或者 for range 遍历一下
|
3
keepeye Oct 22, 2021
队列啊 先进先出
|
4
Grocker OP |
5
Keystroke Oct 22, 2021 via Android
我猜你是想问为什么 close 了还会接收到 5 而不是 0 。
因为接收操作的底层逻辑是先 qcount > 0,即缓冲队列是否还有元素。再判断 closed != 0,即管道是否关闭。所以,5 和 6 取出后才是 0 。 |
6
Keystroke Oct 22, 2021 via Android
好像是我想多了。
|
7
labulaka521 Oct 22, 2021
For a channel c, the built-in function close(c) records that no more values will be sent on the channel. After calling close, and after any previously sent values have been received, receive operations will return the zero value for the channel's type without blocking.
@Keystroke https://golang.org/ref/spec#Close |
8
Keystroke Oct 22, 2021 via Android
@labulaka521
我说的不是一个意思吗? |
9
xfriday Oct 22, 2021
|
13
guanhui07 Oct 23, 2021
先进先出
|