這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本部落格已遷移至 www.0x520.com
之前用channel練習的時候遇到一個問題,看似好像代碼合理,而且編譯也不會有問題,但忘記了一個重要的channel特性。
正確的代碼:
package mainimport "fmt"func foo(){ defer fmt.Println("World") fmt.Println("Hello")}func sum(x,y int,c chan int){ c <- x + y}func main(){ foo() c := make (chan int); go sum(24,18,c) fmt.Println(<-c);}
如果我把代碼改成:
package mainimport "fmt"func foo(){ defer fmt.Println("World") fmt.Println("Hello")}//func sum(x,y int,c chan int){// c <- x + y//}func main(){ foo()// c := make (chan int);// go sum(24,18,c)// fmt.Println(<-c); c := make (chan int) d := 2 c <- d+3 fmt.Println(<-c)}
或者
package mainimport "fmt"func foo(){ defer fmt.Println("World") fmt.Println("Hello")}func sum(x,y int,c chan int){ c <- x + y}func main(){ foo() c := make (chan int); sum(24,18,c) fmt.Println(<-c);}
都會出現以下錯誤:
HelloWorldfatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:main.main() /Users/john/a1.go:20 +0x60exit status 2
這是為什麼呢,看似合理的程式,是忽略了Channel是阻塞的,如果沒有使用go Channel就一直在阻塞的狀態,執行就死迴圈了。這個特性也在很多場合帶來了方便。