æ¥è‡ªEffective Go
 Â接收器始终阻塞,直到有数æ®è¦æŽ¥æ”¶ä¸ºæ¢ã€‚如果通é“未缓冲,则å‘é€æ–¹å°†é˜»å¡žï¼Œç›´åˆ°æŽ¥æ”¶æ–¹æ”¶åˆ°è¯¥å€¼ã€‚
但是signal.Notify会将信å·ä¸ç»§åˆ°æ— 缓冲的通é“而ä¸ä¼šé˜»å¡žã€‚这是如何工作的,是å¦å¯ä»¥ä¸Žå…¶ä»–陈< - 类型?
一起使用ç”案 0 :(得分:6)
当os.Notify
æ— æ³•é˜»æ¢æ—¶ï¼Œå®ƒæ„味ç€å¦‚æžœè¦é˜»æ¢ï¼Œåˆ™ä¼šä¸¢å¼ƒæ¶ˆæ¯ã€‚å› æ¤ï¼Œè™½ç„¶å®ƒæ²¡æœ‰é˜»æ¢å®ƒæ˜¯çœŸçš„,但如果它们ä¸èƒ½ç«‹å³è¢«æŽ¥æ”¶ï¼Œé‚£ä¹ˆå®ƒå°†ä¼ 递信å·æ˜¯ä¸æ£ç¡®çš„。这是通过简å•çš„select
:
select {
case channel <- message:
// message sent
default:
// message dropped
}
这就是Notify
的文档明确指出您应该使用缓冲通é“çš„åŽŸå› ã€‚å¦è¯·æ³¨æ„,缓冲通é“也å¯ä»¥é˜»å¡žï¼Œè€Œä¸ä»…ä»…æ˜¯æ— ç¼“å†²é€šé“;缓冲通é“仅在缓冲区已满时阻æ¢ã€‚
select
。
ç”案 1 :(得分:0)
这就是为什么 Notify 的文档明确指出您应该使用缓冲通é“
使用 Go 1.17,the tool vet
也会使这一点更清楚:
df2 <- df$out3$parm$stand
setDT(df2)[, flag := data.table::fcase(is.na(V8), 9L, V8 < 500, 3L, V7 > 500, 2L, default = 1L)][]
V1 V2 V3 V4 V5 V6 V7 V8 flag
1: 892 332 190 481 568 836 105 414 3
2: 221 753 714 938 301 222 NA 676 1
3: 103 354 416 192 900 478 998 NA 9
4: 518 504 780 540 201 209 896 183 3
5: 603 799 576 869 187 569 905 643 2
工具现在会è¦å‘Šå¯¹ vet
çš„è°ƒç”¨ï¼Œå¹¶å°†ä¼ å…¥ä¿¡å·å‘é€åˆ°æ— 缓冲通é“。
ä½¿ç”¨æ— ç¼“å†²é€šé“å¯èƒ½ä¼šä¸¢å¤±åœ¨å…¶ä¸Šå‘é€çš„ä¿¡å·ï¼Œå› 为 signal.Notify
在å‘é€åˆ°é€šé“æ—¶ä¸ä¼šé˜»å¡žã€‚
例如:
signal.Notify
c := make(chan os.Signal)
// signals are sent on c before the channel is read from.
// This signal may be dropped as c is unbuffered.
signal.Notify(c, os.Interrupt)
的用户应使用具有足够缓冲空间的信é“以跟上预期的信å·é€ŸçŽ‡ã€‚