【问题标题】:Declare mutiple variables on the same line with types in Go在 Go 中使用类型在同一行声明多个变量
【发布时间】:2021-10-11 09:44:36
【问题描述】:

我有以下代码 sn-p:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    var reader *bufio.Reader = bufio.NewReader(os.Stdin)
    fmt.Println("Enter your name")
    name, err := reader.ReadString('\n') //THIS LINE
    if err == nil {
        fmt.Println("Hello " + name)
    }
}

我的问题是,如果我不想使用 := 语法(就像我在 main() 的第一行所使用的那样),我将如何使用类型重写 ReadString() 调用?

我尝试了以下方法,但出现了相应的错误:

  1. var name string, err error = reader.ReadString('\n') -> syntax error: unexpected comma at end of statement
  2. var name, err string, error = reader.ReadString('\n') -> syntax error: unexpected comma at end of statement
  3. Multiple variables of different types in one line in Go (without short variable declaration syntax) 获得提示,我也尝试了var (name string, err error) = reader.ReadString('\n'),它也给出了同样的错误。

对于上面链接的问题,标记的答案只是建议对两种不同的变量类型使用两行。但是对于像ReadString() 这样的函数的返回值,这将如何工作呢?

【问题讨论】:

  • var name, err = reader.ReadString('\n')?或者为什么不用var 预先声明变量并指定类型并在之后使用它?
  • var name, err = reader.ReadString('\n') 不会使类型信息明显,var reader *bufio.Reader = bufio.NewReader(os.Stdin) 的方式很明显 reader*bufio.Reader 类型。至于之前用类型声明变量,我可以这样做,但我会失去单行的好处。如果您看到我迄今为止尝试过的示例,也许这会澄清我在寻找什么。
  • 为了更好的代码可读性,我会在单线利益上妥协。
  • 不可能在单个语句中显式声明两种类型。 variable spec 可以有零个或一个类型。
  • 我认为这是一个合理的担忧。欢迎您为 Go 语言的新语法提交提案。

标签: go


【解决方案1】:

首先,

name, err := reader.ReadString('\n')`

完全没问题。如果您不知道ReadString() 的返回值类型,大多数IDE 会显示它们。

正如linked answer 的详细信息,一个变量声明最多可以有一个可选类型,因此不能指定两种类型。

如果您对类型不可见感到困扰,这意味着 可读性 对您来说更重要。如果是这样,请打破“单线即赢”的理念。

如果您希望类型在源代码中可见,请先声明类型,然后使用赋值:

var (
    name string
    err  error
)
name, err = reader.ReadString('\n')

如果您仍然需要一个衬里(只是为了好玩),它需要一个辅助函数。辅助函数的名称可以“说明”预期的类型:

func stringAndError(s string, err error) (string, error) {
    return s, err
}

那么你可以使用变量声明或短变量声明:

var name, err = stringAndError(reader.ReadString('\n'))
// OR
name, err := stringAndError(reader.ReadString('\n'))

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2014-01-31
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多