Effective GO 重新声明和重新分配 | Go主题月

287 阅读2分钟
Go是一种新语言。 尽管它借鉴了现有语言的思想,但它具有非同寻常的特性,使有效的Go程序的特性与亲戚编写的程序有所不同。 将C ++或Java程序直接转换为Go不太可能产生令人满意的结果-Java程序是用Java而不是Go编写的。 另一方面,从Go角度考虑问题可能会产生一个成功但完全不同的程序。 换句话说,要写好语言,重要的是要了解它的特性和习惯用法。 了解Go编程中已建立的约定(例如命名,格式设置,程序构造等)也很重要,这样您编写的程序将易于其他Go程序员理解。
f, err := os.Open(name)
if err != nil {
    return err
}
d, err := f.Stat()
if err != nil {
    f.Close()
    return err
}
codeUsing(f, d)

这个例子详细说明了:= short声明的工作方式。调用os.Open的声明为:

f, err := os.Open(name)

该语句声明了两个变量f和err。 几行后,对f.Stat的调用显示为:

d, err := f.Stat()

看起来好像它声明了d和err。但是,请注意,err出现在两个语句中。这种复制是合法的:err由第一条语句声明,但只在第二条语句中重新赋值。这意味着对f.Stat的调用使用上面声明的现有err变量,并只给它一个新值。

在a:=声明中,变量v即使已经被声明,也可能出现,前提是:

  • 这个声明和v的现有声明在同一个作用域中(如果v已经在外部作用域中声明了,那么这个声明将创建一个新的变量§),
  • 初始化中对应的值可以分配给v,和
  • 声明至少还创建了一个其他变量。

这种不寻常的特性是纯粹的实用主义,例如,在一个长长的if-else链中,可以很容易地使用单个err值。你会经常看到它的使用。

§这里值得注意的是,在Go中,函数参数和返回值的作用域与函数体相同,尽管它们在包含函数体的大括号之外。

golang外文翻译计划golang.org/doc/effecti…