英文:
Channels/Goroutines throwing error
问题
我目前正在按照这个教程进行学习http://www.miek.nl/files/go/20120807-go.pdf,在第7章中讨论了通道/ goroutine。
然而,当我运行示例代码后,它给我抛出了一个错误。
这是你执行代码时的输出:
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
我的代码有什么问题吗?
任何帮助将不胜感激。
英文:
I'm currently following this tutorial http://www.miek.nl/files/go/20120807-go.pdf and on chapter 7 it discusses channels/goroutines
However the example code is throwing an error for me just after you run it.
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
}
Here is the output when you execute the code
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
Is there something wrong with my code?
Any help would be appreciated
答案1
得分: 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, "已准备好!")
c <- 1
}
func main() {
c = make(chan int) // 之前是 c := make(chan int)
go ready("茶", 2)
go ready("咖啡", 1)
fmt.Println("等待中...")
<-c
<-c
}
main()
没有使用全局的 c
,因为它声明了一个新的。
请注意,你不必在 main()
函数内部创建通道,可以在声明时创建:
var c = make(chan int)
英文:
Yes, just a typo:
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()
didn't use the global c
since it declared a new one.
Notice that you don't have to make the channel inside main()
, make it while declaring it:
var c = make(chan int)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论