我正在尝试编写一个函数来输入一个字符串或 int 类似下面的东西,但找不到办法做到这一点......虽然不知道我在做什么,但很新......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}然后使用它(虽然这不起作用!):var firstName stringgetUserInput(firstName)var age intgetUserInput(age)
1 回答

慕斯709654
TA贡献1840条经验 获得超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)
}
您必须传入一个指向接口参数的指针,因此在&此处使用 use 运算符。
var firstName string
getUserInput(&firstName)
var age int
getUserInput(&age)
如果您尝试扫描错误的类型,您会丢失输入,或者仅读取部分输入。如果您想扫描多种类型,通常最好从标准输入读取令牌,并根据您想要的类型进行检查。然后,您不仅可以获得用于比较的输入,而且还可以生成有用的错误消息。
- 1 回答
- 0 关注
- 186 浏览
添加回答
举报
0/150
提交
取消