golang扫描为字符串或整数

Mat*_*hew 4 string int scanf go

我正在尝试编写一个函数来输入字符串或整数,如下所示,但是找不到解决方法……不确定我在做什么,还很新。

func getUserInput(input interface{}) (int, error) {

    var err error

    switch t := input.(type) {
    default:
        fmt.Printf("unexpected type %T", t)
    case int:
        _, err = fmt.Scanf("%d", input)
    case string:
        _, err = fmt.Scanf("%s", input)
    }

    if err != nil {
        return 0, err
    }

    return 0, nil
}
Run Code Online (Sandbox Code Playgroud)

然后使用类似的东西(这是行不通的!):

var firstName string
getUserInput(firstName)

var age int
getUserInput(age)
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 5

您的default情况是第一位的,因此没有其他匹配的案例。放在最后。您无法扫描到一个值,需要一个指针,因此将类型切换用例更改为它们的指针等效项。

switch t := input.(type) {
case *int:
    _, err = fmt.Scanf("%d", input)
case *string:
    _, err = fmt.Scanf("%s", input)
default:
    fmt.Printf("unexpected type %T", t)
}
Run Code Online (Sandbox Code Playgroud)

您必须传递一个指向接口参数的指针,因此请在&此处使用use 运算符。

var firstName string
getUserInput(&firstName)

var age int
getUserInput(&age)
Run Code Online (Sandbox Code Playgroud)
  • 您会丢失输入,或者如果尝试扫描错误的类型,则只会读取其中的一部分。如果要扫描多种类型,通常最好从stdin中读取令牌,然后根据所需类型进行检查。然后,您不仅具有用于比较的输入,而且还具有产生有用的错误消息的输入。