var vs := in Go



在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中,所有顶级表单都以typevarfunc开头。简短的声明会毁掉所有的可爱。

Go编程语言规范

短期变量声明

简短的变量声明使用以下语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

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

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

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

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

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

失败,编译器错误为"函数体外部的非声明语句"。

相关内容

  • 没有找到相关文章

最新更新