一尘不染

在简短的变量声明中从其他块中重新声明变量

go

如何在简短的变量声明中从其他块中重新声明变量?

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

关于此问题有很话题,但现在我很感兴趣如何解决此问题。


阅读 220

收藏
2020-07-02

共1个答案

一尘不染

简短的变量声明的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

这是前面的示例,改写为使用显式正则变量声明和命名函数参数,而不是隐式短变量声明。变量声明始终可以显式地编写为常规变量声明或命名函数参数。隐式短变量声明只是常规变量声明的简写。

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

在您的示例中,短变量声明errred重新声明了err; 的返回参数声明。他们在同一个街区。因此,新方法err不会屏蔽return参数err

2020-07-02