小编wil*_*woo的帖子

带有通道和等待组的 Golang select 语句

尝试使用 Golang,我创建了一个带有 select 语句的函数,用于侦听两个通道。

我的问题是代码的行为似乎不确定- 有时它会恐慌,有时它会成功完成。

我的期望是这段代码应该总是恐慌。它应该首先收到错误,因为它应该在 waitGroup 完成之前被调度,因此在成功通道被推送到之前。

package main

import (
    "errors"
    "fmt"
    "sync"
)

func main() {
    errs := make(chan error, 1)
    success := make(chan bool, 1)

    doSomething(success, errs)

    select {
    case err := <-errs:
        fmt.Println("error", err)
        panic(err)
    case <-success:
        fmt.Println("success")
    }
    fmt.Println("finished successfully")
}

func doSomething(success chan bool, errs chan error) {
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        err := errors.New("Some error")
        errs <- err
    }()

    wg.Wait()
    success <- true
}
Run Code Online (Sandbox Code Playgroud)

go

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

标签 统计

go ×1