相关疑难解决方法(0)

防止main()函数在goroutines在Golang中完成之前终止

已经厌倦了这个人为的例子:

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中使类似代码工作而不是过早终止的惯用方法是什么?

concurrency program-entry-point go goroutine

10
推荐指数
1
解决办法
4032
查看次数

为什么 Go 的通道可以关闭两次?

当我在做一些 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两次?

channel go

2
推荐指数
1
解决办法
9255
查看次数

如何修复 2 个通道相互死锁

我有这段 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)

locking channel go

2
推荐指数
1
解决办法
83
查看次数

关闭未知长度的通道

当不知道它的
长度时,我无法关闭频道

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)

concurrency channel go

1
推荐指数
1
解决办法
1939
查看次数