Go中一行中的不同类型的多个变量(没有短变量声明语法)

时间:2017-07-13 16:13:27

标签: go

我想知道Go是否可以在一行中声明和初始化不同类型的多个变量而不使用短声明语法:=

例如声明两个相同类型的变量是可能的:

var a, b string = "hello", "world"

也可以使用:=语法声明不同类型的变量:

c, d, e := 1, 2, "whatever"

这给了我一个错误:

var f int, g string = 1, "test"

我当然希望保留该类型,否则我只能使用:=语法。

不幸的是我找不到任何例子,所以我假设这是不可能的?

如果没有,任何人都知道是否有计划在未来的版本中引入这种语法?

2 个答案:

答案 0 :(得分:8)

如果省略类型:

var i, s = 2, "hi"
fmt.Println(i, s)

输出(在Go Playground上尝试):

2 hi

请注意,short variable declaration正是这方面的简写:

  

短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
     

它是具有初始化表达式的常规variable declaration的简写,但没有类型:

"var" IdentifierList = ExpressionList .

不省略类型是不可能的,因为variable declaration的语法是:

VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .

(带有表达式列表的标识符列表只有一种可选类型。)

另外我假设你不把它算作1行(否则它是有效的语法,但是gofmt将它分成多行):

var (i int = 2; s string = "hi")

此外,如果您只想明确说明类型,可以在右侧提供:

var i, s = int(2), string("hi")

但总而言之,只需使用2行代表2种不同的类型,没有什么可失去的,可以获胜。

答案 1 :(得分:2)

这并不是OP的特定问题,而是因为它会出现在搜索结果中,以便在同一行中声明多个变量(目前无法实现)。一种更清洁的方法是:

var (
    n []int
    m string
    v reflect.Value
)