Go vs:= Go

时间:2014-02-09 09:34:50

标签: go variable-assignment colon-equals

在此处的Go网络服务器示例中:http://golang.org/doc/effective_go.html#web_server

以下代码行

var addr = flag.String("addr", ":1718", "http service address")

但将其更改为

addr := flag.String("addr", ":1718", "http service address")

是编译错误。为什么?是否与函数的返回类型为*string而不是string的面有任何关系?这有什么不同?

更新:感谢您指出顶层不允许:=。知道为什么这种不一致性在规范中?我认为没有任何理由让这个行为在一个街区内有所不同。

3 个答案:

答案 0 :(得分:16)

在Go中,顶级变量分配必须var关键字为前缀。只允许在块中省略var关键字。

package main

var toplevel = "Hello world"         // var keyword is required

func F() {
        withinBlock := "Hello world" // var keyword is not required
}

答案 1 :(得分:13)

关于更新的问题:长和短声明之间实际上存在差异,因为短表格允许重新声明变量。

来自spec

  

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在相同的块中具有相同类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;它只是为原始版本赋予了一个新值。

field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // redeclares offset
a, a := 1, 2                              // illegal: double declaration of a or no new variable if a was declared elsewhere

所以我说:=运算符不是纯声明,而是更像声明和赋值。 不允许在顶层重新声明,因此也不是简短声明。

另一个原因可能是语法简单。在Go中,所有顶级表单都以typevarfunc开头。简短的声明会破坏所有的可爱。

答案 2 :(得分:5)

  

The Go Programming Language Specification

     

Short variable declarations

     

短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
     

短变量声明可能只出现在函数内部。

在您的示例中,在函数体外部更改变量声明语句

var addr = flag.String("addr", ":1718", "http service address")

到函数体外的短变量声明语句

addr := flag.String("addr", ":1718", "http service address")

因编译器错误“函数体外的非声明语句而失败。”