在短变量声明中重新声明来自不同块的变量

时间:2011-02-17 13:54:57

标签: scope go

如何在短变量声明中重新声明来自不同块的变量?

func f() (err os.Error) {
    proc, err := os.StartProcess(blah blah blah)
    // the new err masks the return value?
}

关于此问题有一个long threadissue,但我对如何解决此问题感兴趣。

2 个答案:

答案 0 :(得分:1)

short variable declarations的Go规范很明确:

  

短变量声明可以   他们提供的重新声明变量   最初在同一个街区宣布   具有相同的类型,至少有一个   非空白变量是新的。

因此,在很短的变量声明,则不能重新声明最初在不同的块中声明的变量。

以下是如何通过声明在内部块的局部变量(e),并将其(e)分配给一个变量来解决这个限制,例如,(err2)宣布在一个外部区块。

package main

import (
    "fmt"
    "os"
)

func f() (err1 os.Error, err2 os.Error) {
    fi, err1 := os.Stat("== err1 os.Error ==")
    _ = fi
    {
        fi, e := os.Stat("== e os.Error ==")
        _ = fi
        err2 = e
    }
    return
}

func main() {
    err1, err2 := f()
    fmt.Println("f() err1:", err1)
    fmt.Println("f() err2:", err2)
}

输出:

f() err1: stat == err1 os.Error ==: no such file or directory
f() err2: stat == e os.Error ==: no such file or directory

下面是前面的例子改写为使用显式规则variable declarations和{命名{3}}而不是隐式function parameters。变量声明总是可以显式写为常规变量声明或命名函数参数;隐式短变量声明只是常规变量声明的简写。

package main

import (
    "fmt"
    "os"
)

func f() (err1 os.Error, err2 os.Error) {
    var fi *os.FileInfo
    fi, err1 = os.Stat("== err1 os.Error ==")
    _ = fi
    {
        var fi *os.FileInfo
        fi, err2 = os.Stat("== err2 os.Error ==")
        _ = fi
    }
    return
}

func main() {
    err1, err2 := f()
    fmt.Println("f() err1:", err1)
    fmt.Println("f() err2:", err2)
}

输出:

f() err1: stat == err1 os.Error ==: no such file or directory
f() err2: stat == err2 os.Error ==: no such file or directory

在你的例子,短变量声明err redeclares的err的返回参数声明;他们在同一个街区。因此,新err不会屏蔽返回参数err

答案 1 :(得分:0)

无法绕过:=声明的范围规则。只需明确使用var=