2011-02-17 106 views

回答

1

short variable declarations的围棋规范是明确的:

短变量声明可以提供 重新声明变量它们 最初在相同块 用相同类型声明的,和至少一个 的非-blank变量是新的。

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

下面是在外部块中声明的是如何通过声明在内部块的局部变量(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并命名为function parameters,而不是隐short variable declarations。变量声明总是可以显式编写为常规变量声明或命名函数参数;隐式短变量声明仅仅是常规变量声明的简写。

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

0

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

+0

你能提供一个例子吗? – 2011-02-17 16:33:08

+0

@MattJoiner我为我的答案添加了一个显式的常规变量声明的例子。 – peterSO 2011-02-17 22:33:58