golang中channel的用法

2021-10-25 18:48:06 字數 2788 閱讀 3266

channel有點類似於管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是golang實現csp模型的關鍵

package main

func

main()

以下是channel的一些使用場景:

等待goroutine完成

package main

func

main()

()println

("do something else"

)<-ch

close

(ch)

println

("end main"

)}

輸出結果

do something else

come into goroutine

end main

多個goroutine協同

三個功能不相關的goroutine最後結果要彙總累加到result上

package main

func

main()

ch <- r

}()gofunc()

ch <- r

}()gofunc()

()for i :=

0; i <

3; i++

close

(ch)

println

("result is:"

, result)

println

("end main"

)}

其中一組列印結果:

start main

come into goroutine3

come into goroutine2

come into goroutine1

result is: 3628866

end main

select

兩個goroutine無直接關聯,但其中乙個先達到某一設定條件便退出或超時退出

package main

import

"time"

func

main()

}()go

func()

}() endcond :=

false

for endcond !=

true

case b :=

<-cond2:

if b ==

100case

<-time.

after

(time.microsecond)

:println

("end with timeout"

) endcond =

true}}

println

("end main"

)}

其中列印結果有可能是:

start main

end with cond1

end main

也有可能是:

start main

end with timeout

end main

也可能是:

start main

end with cond2

end main

這說明迴圈100次大概需要1微秒的時間

channel與range

package main

import

"fmt"

func

main()

// 如果不關閉channel,會引發panic

close

(ch)}(

)for v :=

range ch

println

("end main"

)}

列印結果為:

start main01

2345

6789

end main

無緩衝channel

package main

func

main()

在playground中執行

列印結果為:

fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan send]:

main.main()

/tmp/sandbox117018544/main.go:5 +0x60

死鎖了,為什麼會這樣呢,因為ch是乙個無緩衝的channel,在執行到ch <- 1就阻塞了當前goroutine(也就是main函式所在的goroutine),後面列印語句根本沒機會執行

稍加修改即能正常執行

package main

func

main()

()println

(<-ch)

}

因為此時ch既有傳送也有接收而且不在同乙個goroutine裡面,此時它們不會相互阻塞

golang中channel的用法

go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...

golang中channel的用法

給 個 nil channel 傳送資料,造成永遠阻塞 從 個 nil channel 接收資料,造成永遠阻塞 給 個已經關閉的 channel 傳送資料,引起 panic 從 個已經關閉的 channel 接收資料,如果緩衝區中為空,則返回 個零值 緩衝的channel是同步的,有緩衝的chann...

golang開發中channel使用

channel 通道 是golang的一種重要特性,正是因為channel的存在才使得golang不同於其它語言。channel使得併發程式設計變得簡單容易有趣。channel的概念和語法 乙個channel可以理解為乙個先進先出的訊息佇列。channel用來在協程 goroutine 之前傳遞資料...