是否可以使用Golang一次声明多个变量?
例如在Python中,您可以输入:
a = b = c = 80
并且所有值都是80。
答案 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”)
一种类型的标识符列表,分配给一个expression或ExpressionList。
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)
}