【问题标题】:Assignment operator in Go languageGo语言中的赋值运算符
【发布时间】:2026-01-13 03:55:02
【问题描述】:

最近我在玩谷歌的新编程语言Go

并且想知道为什么赋值运算符:= 在等号= 前面有一个冒号 该语言的作者想要使用name := "John" 而不是name = "John" 是否有特殊原因

【问题讨论】:

  • 很好的问题,答案是使用 = 赋值是一个错误。你很早就知道 x + 2 = 4 是一个方程而不是一个赋值。然而,由于赋值比检查相等性要频繁得多,一些主流语言很早就开始使用“=”进行赋值......并且约定被卡住了。
  • @RickO'Shea - 但 Go 也使用 = 进行赋值。

标签: syntax go


【解决方案1】:

:= 表示法既可用作声明,也可用作初始化。

foo := "bar"

等价于

var foo = "bar"

您可能会问,为什么不像在任何脚本语言中那样只使用foo = "bar"?嗯,这是为了避免拼写错误。

foo = "bar"
fooo = "baz" + foo + "baz"   // Oops, is fooo a new variable or did I mean 'foo' ?

【讨论】:

    【解决方案2】:
    name := "John"
    

    只是

    的语法糖
    var name string
    name = "John"
    

    Go 是静态类型的,所以你必须声明变量。

    【讨论】:

    • name := "John"var name = "John" 的简写。
    • @peterSO 但var name = "John"var name string = "John" 的缩写,它是给定的两行的缩写。
    • @Dave C:The Go Programming Language Specification 是明确的:“短变量声明......是带有初始化表达式但没有类型的常规变量声明的简写:"var" IdentifierList = ExpressionList .”。
    • @peterSO 我知道,我也读过。这不会改变我所说的。这个答案是正确的。
    • @KennethWorden 它是如何阻碍可读性的?它最大限度地减少了不必要的信息。具有完整类型推断的语言就是为什么这是一件好事的一个很好的例子。
    【解决方案3】:

    := 不是赋值运算符。这是一个简短的变量声明。 = 是赋值运算符。

    Short variable declarations

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

    ShortVarDecl = IdentifierList ":=" ExpressionList .

    它是带有初始化器的常规变量声明的简写 表达式但没有类型:

    "var" IdentifierList = ExpressionList .

    Assignments

    Assignment = ExpressionList assign_op ExpressionList .

    assign_op = [ add_op | mul_op ] "=" .

    在 Go 中,name := "John"var name = "John" 的简写。

    【讨论】:

      【解决方案4】:

      Rob Pike explains 为什么 Go 有 := 在他的演讲“围棋的起源”(2010 年)。

      := 是由 Pike 代号为 Newsquek (1989) 的另一种语言的伪运算符。 它具有 Pascal 式的表示法,并且能够推断声明和初始化习语的类型 (page 15)

      // variable: [type] = value
      x: int = 1
      x := 1
      

      旁注: Robert Griesemer brings up := 操作员回答问题“你会从 Go 中取出什么?”在 2013 年 Google I/O 的 QA 会议期间。将其称为方便但有问题

      【讨论】:

        【解决方案5】:

        两者之间至少有一个细微差别

        name := "John"
        

        var name = "John"
        

        前者是非声明语句,不允许在函数体之外,而后者是包级别的有效语句。

        【讨论】:

          【解决方案6】:

          两者都是 Go 语言中变量声明的不同技术。

          var name = "John" // is a variable declaration 
          

          name := "John"   // is a short variable declaration. 
          

          短变量声明是带有初始化表达式但没有类型的常规变量声明的简写。

          阅读下文了解详情:

          Variable declarations

          Short variable declarations

          【讨论】:

            【解决方案7】:

            答案的重要背景:

            := 是用于初始化变量的速记运算符。在 Go 中,以下操作是等价的:

            var myNumb String = "one"
            myNumb := "one"
            

            答案:

            现在隐含的问题是:“为什么要设计速记符号 :== 之前有一个 :?”。原因是为了防止流行的错别字。如果简写赋值运算符只是=,那么您可能会遇到以下情况:

            var myNumb String = "one"
            myNumb = "two"
            

            现在创建该代码的用户是否打算将two 重新分配给myNumb,或者他是否输入错误myNumb 而不是正确输入myNumbTwo?通过在:= 中包含冒号,程序员必须犯两个错误(忘记冒号并忘记var)才能产生错误,从而大大降低这样做的可能性 .

            【讨论】: