[英]Read and write on the same channel in select
這樣可以使用一個通道在兩個例程之間交換數據嗎?
c := make(chan int)
go func() {
var i int
select {
case c<- 1:
i = <-c
case i = <-c:
c<- 1
}
fmt.Println(" A - Written 1 red ", i)
}()
var i int
select {
case c<- 2:
i = <-c
case i = <-c:
c<- 2
}
fmt.Println(" B - Written 2 red ", i)
它可以工作 ,但通常是個壞主意(tm)
您未來的軟件維護者會為此而恨您
請注意,如果這些循環不完全相同,則當主goroutine阻塞時,由於沒有其他人在讀或寫,因此應用程序將崩潰
package main
import (
"fmt"
)
func main() {
c := make(chan int)
go func() {
for x := 0; x < 5; x++ {
var i int
select {
case c <- 1:
i = <-c
case i = <-c:
c <- 1
}
fmt.Println(" A - Written 1 red ", i)
}
}()
for x := 0; x < 5; x++ {
var i int
select {
case c <- 2:
i = <-c
case i = <-c:
c <- 2
}
fmt.Println(" B - Written 2 red ", i)
}
}
輸出:
B - Written 2 red 1
A - Written 1 red 2
B - Written 2 red 1
A - Written 1 red 2
B - Written 2 red 1
A - Written 1 red 2
B - Written 2 red 1
A - Written 1 red 2
B - Written 2 red 1
Program exited.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.