在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
本身已经很复杂,并且想要保持苗条的轻松性未来的了解。
答案 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
。