package main
import (
"fmt"
)
func main() {
c := make(chan int, 5)
c <- 5
c <- 6
close(c)
fmt.Println(<-c)
}
这段代码输出的结果为什么是 5 ?没太看明白
1
labulaka521 2021-10-22 18:11:00 +08:00
先进先出
5 进去了 6 进去了-> 5 出来了 6 出来了 |
2
dugoj 2021-10-22 18:13:16 +08:00
类似先入先出的 FIFO 队列,你再 print 一下就是 6 了,或者 for range 遍历一下
|
3
keepeye 2021-10-22 18:15:33 +08:00
队列啊 先进先出
|
4
Grocker OP |
5
Keystroke 2021-10-22 18:18:11 +08:00 via Android
我猜你是想问为什么 close 了还会接收到 5 而不是 0 。
因为接收操作的底层逻辑是先 qcount > 0,即缓冲队列是否还有元素。再判断 closed != 0,即管道是否关闭。所以,5 和 6 取出后才是 0 。 |
6
Keystroke 2021-10-22 18:19:36 +08:00 via Android
好像是我想多了。
|
7
labulaka521 2021-10-22 18:28:14 +08:00
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 2021-10-22 18:50:31 +08:00 via Android
@labulaka521
我说的不是一个意思吗? |
9
xfriday 2021-10-22 21:01:22 +08:00
|
10
Keystroke 2021-10-22 21:24:21 +08:00 via Android
@xfriday
你先去试试楼主的代码最后一句改成你说的样子。看看 ok 是 true 还是 false 。 |
13
guanhui07 2021-10-23 11:27:33 +08:00
先进先出
|
14
xfriday 2021-10-23 15:33:38 +08:00
@Keystroke 我的意思就是别拿零值做判断而已,就像 r, err := foo(),别判断 r 是不是零值,而该判断 err 是不是 nil
|