我目前正在關注本教程http://www.miek.nl/files/go/20120807-go.pdf,并在第7章中討論了渠道/ goroutines但是,示例代碼在運行后立即對我拋出錯誤。package mainimport ( "fmt" "time")var c chan intfunc 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 +0xeegoroutine 2 [syscall]:created by runtime.main /build/buildd/golang-1/src/pkg/runtime/proc.c:221goroutine 3 [chan send (nil chan)]:main.ready(0x80bb0d4, 0x3, 0x2, 0x0) /home/daniel/Dropbox/code/go/goroutines.go:13 +0xe5created by main.main /home/daniel/Dropbox/code/go/goroutines.go:18 +0x5egoroutine 4 [chan send (nil chan)]:main.ready(0x80bba30, 0x6, 0x1, 0x0) /home/daniel/Dropbox/code/go/goroutines.go:13 +0xe5created by main.main /home/daniel/Dropbox/code/go/goroutines.go:19 +0x80goroutine 5 [timer goroutine (idle)]:created by addtimer /build/buildd/golang-1/src/pkg/runtime/ztime_386.c:69exit status 2我的代碼有問題嗎?
1 回答

弒天下
TA貢獻1818條經驗 獲得超8個贊
是的,只是一個錯字:
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)
- 1 回答
- 0 關注
- 232 瀏覽
添加回答
舉報
0/150
提交
取消