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

Fra*_*ula 6 go

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

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

var a, b string = "hello", "world"
Run Code Online (Sandbox Code Playgroud)

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

c, d, e := 1, 2, "whatever"
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

var f int, g string = 1, "test"
Run Code Online (Sandbox Code Playgroud)

当然我想保留类型,否则我可以使用:=语法.

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

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

icz*_*cza 10

如果省略类型,则可以:

var i, s = 2, "hi"
fmt.Println(i, s)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

2 hi
Run Code Online (Sandbox Code Playgroud)

请注意,短变量声明正是这个的简写:

一个短变量声明使用语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .
Run Code Online (Sandbox Code Playgroud)

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

"var" IdentifierList = ExpressionList .
Run Code Online (Sandbox Code Playgroud)

在不省略类型的情况下,它是不可能的,因为变量声明的语法是:

VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
Run Code Online (Sandbox Code Playgroud)

(对于带有表达式列表的标识符列表,只有一种可选类型.)

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

var (i int = 2; s string = "hi")
Run Code Online (Sandbox Code Playgroud)

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

var i, s = int(2), string("hi")
Run Code Online (Sandbox Code Playgroud)

但总而言之,只需使用两条不同类型的2条线,没有什么可失去的,可读性就赢了.

  • 总而言之,只需要使用两条不同类型的2条线,它就不会因为它而失去任何东西......无论如何它实际上更具可读性...... (2认同)

Jun*_*aid 5

这并不完全特定于OP的问题,但因为它会出现在搜索结果中,以便在一行中声明多个变量(目前这是不可能的)。一个更干净的方法是:

var (
    n []int
    m string
    v reflect.Value
)
Run Code Online (Sandbox Code Playgroud)