Golang Select语句范围

时间:2019-04-30 07:03:01

标签: go

在Go中,我知道每个新的括号都声明了一个新的作用域,这对于所有控制流语句都是如此。今天,在编写程序时,我偶然遇到了一种需要使用如下所示的select语句的情况

select {
case <-ctx.Done():
    <-ch
    return ctx.Err()
case resp := <-ch:
    var b bytes.Buffer
    if _, err := io.Copy(&b, resp.Body); err != nil {
        return err
    }
}

从上面的代码中,我想在select语句关闭后访问b变量。可以吗?

我知道我可以在选择内移动使用b的逻辑,但是我不想走那条路,因为select本身已经很复杂,并且想要保持苗条的轻松性未来的了解。

1 个答案:

答案 0 :(得分:2)

如果打算在var之后使用select,则最好在select外部声明一个var b bytes.Buffer select { case <-ctx.Done(): <-ch return ctx.Err() case resp := <-ch: if _, err := io.Copy(&b, resp.Body); err != nil { return err } } ... // use b here

b

这里没有阴影,除非您在内部作用域中声明了另一个b = <something>,否则您就无法阴影。在此处的选择内分配b只会分配给右边的awk ' BEGIN{ FS=";" OFS=": " } val{ sub(/: $/,"",val) print val val="" } { $1="user" $2=$2 " address" $3=$3 " db" $4=$4" right" val=$0 } END{ if(val){ sub(/: $/,"",val) print val } } ' Input_file