給⼀個 nil channel 傳送資料,造成永遠阻塞 ▪ 從⼀個 nil channel 接收資料,造成永遠阻塞
給⼀個已經關閉的 channel 傳送資料,引起 panic ▪ 從⼀個已經關閉的 channel 接收資料,如果緩衝區中為空,則返回⼀個零值
⽆緩衝的channel是同步的,⽽有緩衝的channel是⾮同步的
close(ch)關閉channel
package mainfunc main() ()
println(
"do something else")
<-ch
close(ch)
println(
"end main")
}
列印結果:
start maindo something else
come into goroutine
end main
三個功能不相關的goroutine
最後結果要彙總累加到result
上
package mainfunc main()
ch <-r
}()go func()
ch <-r
}()go func() ()
for i := 0; i < 3; i++
close(ch)
println(
"result is:
", result)
println(
"end main")
}
其中一組列印結果:
start maincome into goroutine3
come into goroutine2
come into goroutine1
result
is: 3628866
end main
兩個goroutine
無直接關聯,但其中乙個先達到某一設定條件便退出或超時退出
package mainimport
"time
"func main()
}()go func()
}()endcond := false
for endcond != true
case b := <-cond2:
if b == 100
case
<-time.after(time.microsecond):
println(
"end with timeout")
endcond = true
} }
println(
"end main")
}
其中列印結果有可能是:
start mainend with cond1
end main
也有可能是:
start mainend with timeout
end main
也可能是:
start mainend with cond2
end main
package mainimport
"fmt
"func main()
//如果不關閉channel,會引發panic
close(ch)
}()for v :=range ch
println(
"end main")
}
列印結果為:
start main012345
6789
end main
package mainfunc main()
fatal error: all goroutines are asleep - deadlock!goroutine1[chan send]:
main.main()
/tmp/sandbox117018544/main.go:5 +0x60
死鎖了,為什麼會這樣呢,因為ch
是乙個無緩衝的channel
,在執行到ch <- 1
就阻塞了當前goroutine
(也就是main函式所在的goroutine
),後面列印語句根本沒機會執行
稍加修改即能正常執行
package mainfunc main() ()
println(
<-ch)
}
ch
goroutine
package main
func
main()
golang中channel的用法
go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...
golang中channel的用法
channel有點類似於管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是golang實現csp模型的關鍵 package main func main 以下是channel的一些使用場景 等待goroutine完成 package main func main println ...
golang開發中channel使用
channel 通道 是golang的一種重要特性,正是因為channel的存在才使得golang不同於其它語言。channel使得併發程式設計變得簡單容易有趣。channel的概念和語法 乙個channel可以理解為乙個先進先出的訊息佇列。channel用來在協程 goroutine 之前傳遞資料...