【问题标题】:Can you declare multiple variables at once in Go?你可以在 Go 中一次声明多个变量吗?
【发布时间】:2014-01-31 00:44:54
【问题描述】:

是否可以使用 Golang 一次声明多个变量?

例如,在 Python 中,您可以输入:

a = b = c = 80

所有值都是 80。

【问题讨论】:

  • 对不起。在 Go 中,= 运算符创建一个语句,而不是一个表达式。这是为了避免人们在其他难以推理的事情中做一些花哨的事情。
  • 编程中的语句和表达式有什么区别?
  • @CharlieParker 一个表达式有一个值,并且可以去任何期望值的地方(例如函数参数)。语句是代码的基本单元。

标签: go variable-assignment


【解决方案1】:

是的,您可以:

var a, b, c string
a = "foo"
fmt.Println(a)

你可以为内联赋值做一些类似的事情,但不是那么方便:

a, b, c := 80, 80, 80

【讨论】:

  • 所以你不能根据去操场play.golang.org/p/jzRcG8Ox4A多么悲伤:'(没有办法做多个声明并同时分配它们。跨度>
  • @CharlieParker 它有效。您只需将类型声明移动到= 的另一侧:play.golang.org/p/cj0nZ-RbpI
  • 这个答案是错误的,他的问题的真正答案是:不,你不能。我正在寻找这个,但是 a, b = 80, 80 与 a, b = 80 不一样
  • 在 Python 中执行 a = b = c = 80 与在 Go 中执行 a, b, c := 80, 80, 80 不同,因为在 Python 中,您使用一个值初始化 3 个变量,而在 Go 中您需要提供 3 个值。所以在我看来,这并不能回答这个问题。
  • 在 go1.16 的时候单行看起来像 var x,y = a, b 或类似的 x,y := a,b
【解决方案2】:

在语言规范方面,这是因为变量定义为:

VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .

(来自“Variable declaration”)

一种类型的标识符列表,分配给expressionExpressionList

const a, b, c = 3, 4, "foo"  // a = 3, b = 4, c = "foo", untyped integer and string constants
const u, v float32 = 0, 3    // u = 0.0, v = 3.0

【讨论】:

    【解决方案3】:

    另一种方法是这样的

    var (
       a = 12
       b = 3
       enableFeatureA = false
    
       foo = "bar"
       myvar float64
       anothervar float64 = 2.4
    )
    

    也适用于 const

    const (
      xconst    = 5
      boolconst = false
    )
    

    【讨论】:

      【解决方案4】:

      是的,你可以,而且它比看起来更微妙。

      首先,你可以做一些简单的事情:

      var a, b, x, y int  // declares four variables all of type int
      

      您可以在函数参数声明中使用相同的语法:

      func foo(a, b string) {  // takes two string parameters a and b
          ...
      }
      

      然后是同时声明和分配变量的简写语法。

      x, y := "Hello", 10   // x is an instance of `string`, y is of type `int`
      

      Golang 中经常遇到的模式是:

      result, err := some_api(...)  // declares and sets `result` and `err`
      if err != nil {
          // ...
          return err
      }
      
      result1, err := some_other_api(...)   // declares and sets `result1`, reassigns `err`
      if err != nil {
          return err
      }
      

      因此,您可以分配给:= 运算符左侧的已定义变量,只要分配给的变量中至少有一个是新的。否则,它的格式不正确。这很漂亮,因为它允许我们为多个 API 调用重用相同的错误变量,而不必为每个 API 调用定义一个新变量。但请注意不要无意中使用以下内容:

      result, err := some_api(...)  // declares and sets `result` and `err`
      if err != nil {
          // ...
          return err
      }
      
      if result1, err := some_other_api(...); err != nil {   // result1, err are both created afresh, 
                                                             // visible only in the scope of this block.
                                                             // this err shadows err from outer block
          return err
      }
      

      【讨论】:

        【解决方案5】:

        在 go-playground 中试试这个: https://play.golang.org/

        package main
        
        import "fmt"
        
        func main() {
            a, b := "a", "b"; //Declare And Assign
            var c, d string;  //Declare Only
            fmt.Println(a,b);
            fmt.Println(c,d);
        }
        

        【讨论】:

          【解决方案6】:

          另一种方法是使用 var 进行包级分配

          package main
          
          import (
              "fmt"
          )
          
          var (
              a, b, c = 80, 80 ,80
          )
          
          func main() {
              fmt.Println(a, b, c)
          }
          

          【讨论】:

            【解决方案7】:

            有几个答案不正确:他们忽略了 OP 询问是否可以一次性将多个变量设置为相同值的事实(对不起,双关语)。

            在 go 中,如果 a、b、c 是变量,您似乎不能,即您必须单独设置每个变量:

            a, b, c := 80, 80, 80
            

            但如果 a、b、c 是常数,则可以:

            const (
                    a = 80
                    b
                    c
                )
            

            【讨论】:

              【解决方案8】:

              长声明

              var varName1, varName2 string = "value","value"
              

              简短声明

              varName1,varName2 := "value1","value2"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-11-16
                • 1970-01-01
                • 2022-08-19
                • 1970-01-01
                • 2022-01-20
                • 2022-01-09
                • 2020-07-27
                相关资源
                最近更新 更多