你能在Go中一次声明多个变量吗?

时间:2014-01-12 05:04:45

标签: go variable-assignment

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

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

a = b = c = 80

并且所有值都是80。

7 个答案:

答案 0 :(得分:65)

是的,你可以:

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

你可以为内联作业做一些类似的事情,但不太方便:

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

答案 1 :(得分:11)

就语言规范而言,这是因为变量定义为:

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

答案 2 :(得分: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
}

答案 3 :(得分:2)

在游乐场试试这个: 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);
}

答案 4 :(得分:1)

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

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

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

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

const (
        a = 80
        b
        c
    )

答案 5 :(得分:0)

另一种方法是这样

from datetime import timedelta, datetime
from airflow import DAG
from airflow.contrib.operators.ssh_operator import SSHOperator


default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'email': ['removed@example.com'],
    'email_on_failure': True,
    'email_on_retry': True,
    'start_date': datetime.now() - timedelta(days=1),
    'retries': 1,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG(dag_id='back_fill_reactivated_photo_dimension',
          default_args=default_args,
          schedule_interval='55 * * * *',
          dagrun_timeout=timedelta(seconds=120))

t1_bash = """
/usr/local/bin/dp/database_jobs/run_py.sh "backfill_photo_dim_reactivated.py"
"""

t1 = SSHOperator(
    ssh_conn_id='ssh_aws_ec2',
    task_id='backfill_photo_dim',
    command=t1_bash,
    dag=dag)

也适用于const

var (
   a = 12
   b = 3
   enableFeatureA = false

   foo = "bar"
   myvar float64
   anothervar float64 = 2.4
)

答案 6 :(得分:0)

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

package main

import (
    "fmt"
)

var (
    a, b, c = 80, 80 ,80
)

func main() {
    fmt.Println(a, b, c)
}