【问题标题】:var vs := in Govar vs := 在 Go 中
【发布时间】:2014-03-06 14:49:42
【问题描述】:

在此处的 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 variable-assignment colon-equals


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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")
      

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

      【讨论】:

        【解决方案3】:

        关于更新的问题:长声明和短声明实际上是有区别的,短形式允许重新声明变量。

        来自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
        

        所以我想说:= 运算符不是纯粹的declare,而是更像declare 和assign。 不允许在顶层重新声明,因此也不允许短声明。

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

        【讨论】:

        • 它实际上只是以前 go 版本中声明+赋值的语法糖。
        猜你喜欢
        • 2012-09-02
        • 2013-10-14
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多