在Go web服务器示例中,如下所示: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
,这与面有关吗?这有什么区别?
更新:感谢您指出:=
在顶级是不允许的。知道为什么规范中会出现这种不一致吗?我看不出有任何理由让街区内的行为有所不同。
在Go中,顶级变量赋值必须以var
关键字为前缀。只有在块中才允许省略var
关键字。
package main
var toplevel = "Hello world" // var keyword is required
func F() {
withinBlock := "Hello world" // var keyword is not required
}
关于更新的问题:长声明和短声明之间实际上有区别,短声明允许重新声明变量。
来自规格:
与常规变量声明不同,短变量声明可以重新声明变量,前提是这些变量最初是在同一块中以相同类型声明的,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量短声明中。重新声明不会引入新的变量;它只是为原始值指定一个新值。
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中,所有顶级表单都以type
、var
或func
开头。简短的声明会毁掉所有的可爱。
短期变量声明
简短的变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList .
简短的变量声明只能出现在函数内部。
在您的示例中,在函数体之外更改变量声明语句
var addr = flag.String("addr", ":1718", "http service address")
到函数体外部的短变量声明语句
addr := flag.String("addr", ":1718", "http service address")
失败,编译器错误为"函数体外部的非声明语句"。