已经厌倦了这个人为的例子:
package main
import "fmt"
func printElo() {
fmt.Printf("Elo\n")
}
func printHello() {
fmt.Printf("Hello\n")
}
func main() {
fmt.Printf("This will print.")
i := 0
for i < 10 {
go printElo()
go printHello()
i++
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序的输出只是"这将打印".输出goroutine printElo()并且printHello不会被发出因为,我猜,main()函数线程将在goroutines甚至有机会开始执行之前完成.
在Golang中使类似代码工作而不是过早终止的惯用方法是什么?
当我在做一些 go 练习代码时,我遇到了一个问题,一个通道可以像这样关闭两次:
// jobs.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
j,more := <-jobs
fmt.Println("receive close: ", j, more)
done <- true
}
}()
close(jobs)
<- done
}
Run Code Online (Sandbox Code Playgroud)
输出:
~ go run jobs.go
Hello, playground
receive close: 0 false
receive close: 0 false
Run Code Online (Sandbox Code Playgroud)
但是当我手动关闭频道两次时,我得到了panic: close of closed channel.
为什么上面的代码可以接收close两次?
我有这段 Go 代码。我需要有这种能力:在一个地方写入通道,并在另一个地方读出它们(反之亦然):
package main
import "fmt"
var ch1=make(chan int)
var ch2=make(chan int)
func f1() {
select {
case <- ch1:fmt.Println("ch1")
default: fmt.Println("default")
}
}
func f2() {
select {
case <- ch2:fmt.Println("ch2")
default: fmt.Println("default")
}
}
func main() {
go f1()
go f2()
ch1<-1
ch2<-2
}
Run Code Online (Sandbox Code Playgroud)
它总是打印这样的东西:
default
ch1
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan send]:
main.main()
/tmp/sandbox970110849/prog.go:22 +0xa0
Run Code Online (Sandbox Code Playgroud)
此外,我试过这个:
package main
import (
"fmt"
"sync"
)
var ch1=make(chan int)
var ch2=make(chan int)
func …Run Code Online (Sandbox Code Playgroud) 当不知道它的
长度时,我无法关闭频道
package main
import (
"fmt"
"time"
)
func gen(ch chan int) {
var i int
for {
time.Sleep(time.Millisecond * 10)
ch <- i
i++
// when no more data (e.g. from db, or event stream)
if i > 100 {
break
}
}
// hot to close it properly?
close(ch)
}
func receiver(ch chan int) {
for i := range ch {
fmt.Println("received:", i)
}
}
func main() {
ch := make(chan int)
for i := 0; i …Run Code Online (Sandbox Code Playgroud)