我目前正在关注本教程http://www.miek.nl/files/go/20120807-go.pdf,第7章讨论了频道/ goroutines
然而,示例代码在您运行之后就为我抛出了一个错误。
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
我的代码有问题吗?
任何帮助将不胜感激
答案 0 :(得分: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
,因为它宣布了一个新的。{/ p>
请注意,您无需在main()
内创建频道,请在宣布频道时制作频道:
var c = make(chan int)