話說golang的channel同步的定義真是讓人無力吐槽,碼農的用戶體驗就這么難搞么,超耐磨阿,無緩沖和緩沖居然有這么大區別。。。。靠
轉載一段網上的資料
--------------------------------------------------------------------------------------------------------------------------------------------------------
golang channel 有緩沖 與 無緩沖 是有重要區別的
我之前天真的認為 有緩沖與無緩沖的區別 只是 無緩沖的 是 默認 緩沖 為1 的緩沖式
其實是徹底錯誤的,無緩沖的與有緩沖channel有着重大差別
那就是一個是同步的 一個是非同步的
怎么說?比如
c1:=make(chan int) 無緩沖
c2:=make(chan int,1) 有緩沖
c1<-1
無緩沖的 不僅僅是 向 c1 通道放 1 而是 一直要有別的攜程 <-c1 接手了 這個參數,那么c1<-1才會繼續下去,要不然就一直阻塞着
而 c2<-1 則不會阻塞,因為緩沖大小是1 只有當 放第二個值的時候 第一個還沒被人拿走,這時候才會阻塞。
打個比喻
無緩沖的 就是一個送信人去你家門口送信 ,你不在家 他不走,你一定要接下信,他才會走。
無緩沖保證信能到你手上
有緩沖的 就是一個送信人去你家仍到你家的信箱 轉身就走 ,除非你的信箱滿了 他必須等信箱空下來。
有緩沖的 保證 信能進你家的郵箱
看測試代碼
有緩沖的
1 package main
2
3 import "fmt"
4
5 var c = make(chan int, 1)
6
7 func f() {
8
9 c <- 'c'
10
11 fmt.Println("在goroutine內")
12 }
13
14 func main() {
15 go f()
16
17 c <- 'c'
18 <-c
19 <-c
20
21 fmt.Println("外部調用")
22 }
無緩沖的
// pp
package main
import (
"fmt"
)
func writeRoutine(test_chan chan int, value int) {
test_chan <- value
}
func readRoutine(test_chan chan int) {
<-test_chan
return
}
func main() {
c := make(chan int)
x := 100
//readRoutine(c)
//go writeRoutine(c, x)
//writeRoutine(c, x)
//go readRoutine(c)
//go readRoutine(c)
//writeRoutine(c, x)
go writeRoutine(c, x)
readRoutine(c)
fmt.Println(x)
}
