2012-08-08 17 views
4

我正在下面這個教程http://www.miek.nl/files/go/20120807-go.pdf並在第7章論述頻道/夠程頻道/夠程拋出錯誤

但是示例代碼拋出一個錯誤,我運行它之後。

package main 

import (
    "fmt" 
    "time" 
) 

var c chan int 

func ready(w string, sec int) { 
    time.Sleep(time.Duration(sec) * time.Second) 
    fmt.Println(w, "is ready!") 
    c <- 1 
} 

func main() { 
    c := make(chan int) 
    go ready("Tea", 2) 
    go ready("Coffee", 1) 
    fmt.Println("Waiting...") 
    <-c 
    <-c 
} 

這裏是當你執行代碼

daniel:go> go run goroutines.go 
Waiting... 
Coffee is ready! 
Tea is ready! 
throw: all goroutines are asleep - deadlock! 

goroutine 1 [chan receive]: 
main.main() 
    /home/daniel/Dropbox/code/go/goroutines.go:21 +0xee 

goroutine 2 [syscall]: 
created by runtime.main 
    /build/buildd/golang-1/src/pkg/runtime/proc.c:221 

goroutine 3 [chan send (nil chan)]: 
main.ready(0x80bb0d4, 0x3, 0x2, 0x0) 
    /home/daniel/Dropbox/code/go/goroutines.go:13 +0xe5 
created by main.main 
    /home/daniel/Dropbox/code/go/goroutines.go:18 +0x5e 

goroutine 4 [chan send (nil chan)]: 
main.ready(0x80bba30, 0x6, 0x1, 0x0) 
    /home/daniel/Dropbox/code/go/goroutines.go:13 +0xe5 
created by main.main 
    /home/daniel/Dropbox/code/go/goroutines.go:19 +0x80 

goroutine 5 [timer goroutine (idle)]: 
created by addtimer 
    /build/buildd/golang-1/src/pkg/runtime/ztime_386.c:69 
exit status 2 

有什麼錯我的代碼輸出?

任何幫助,將不勝感激

回答

6

是的,只是一個錯字:

package main 

import (
    "fmt" 
    "time" 
) 

var c chan int 

func ready(w string, sec int) { 
    time.Sleep(time.Duration(sec) * time.Second) 
    fmt.Println(w, "is ready!") 
    c <- 1 
} 

func main() { 
    c = make(chan int) // previously c := make(chan int) 
    go ready("Tea", 2) 
    go ready("Coffee", 1) 
    fmt.Println("Waiting...") 
    <-c 
    <-c 
} 

main()沒有使用全球c,因爲它宣佈一個新的。

請注意,您不必使內main()通道,使其同時它聲明:

var c = make(chan int) 
+0

D'哦!謝謝你的解決 – djhworld 2012-08-08 13:37:02