【问题标题】:Multiple variables of different types in one line in Go (without short variable declaration syntax)Go中一行不同类型的多个变量(没有短变量声明语法)
【发布时间】:2017-12-18 13:23:46
【问题描述】:

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

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

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

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

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

这反而给了我一个错误:

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

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

很遗憾,我找不到任何示例,所以我假设这是不可能的?

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

【问题讨论】:

    标签: go


    【解决方案1】:

    如果你省略类型是可能的:

    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 行,没有什么可失去的,可读性胜出。

    【讨论】:

    • 是的,我知道,但我当然希望类型明确,否则我可以使用 := 语法并使用 =)
    • 您可以强制转换类型。 var i, s = int(2), string("hi").
    • @StephenWeinberg 这是我可以接受的东西,我会在一行中同时具有可读性和显式类型,谢谢!
    • 是的,但这不是很地道。熟悉 Go 的人都知道 2 是一个 int 而“hi”是一个字符串,除非在别处定义了类型。我会在代码审查中拒绝它。
    • 总而言之,2行就2种不同的类型,也不会因此而丢失任何东西……反正它实际上更具可读性……
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2018-12-09
      • 2021-12-30
      • 1970-01-01
      相关资源
      最近更新 更多