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 之前傳遞資料...