讨论数量:
读字符串,然后转成 int 会不会好一些。
func main() {
var num int
for {
fmt.Println("输入一个数字")
line, err := bufio.NewReader(os.Stdin).ReadString('\n')
if err != nil {
continue
}
line = strings.Trim(line, "\r\n")
num, err = strconv.Atoi(line)
if err == nil {
break
}
}
fmt.Println("结束", num)
}
根据简单的测试结果,像是逐字符解析的(具体未知,暂未找到相关文档),你试一下数字和字母的混合输入并变换一下顺序会发现:当解析到非数字时,抛出错误,解析到数字或连续数字时,获取数字并结束
可能这样更准确一些:按顺序解析字符的时候,解析失败,触发异常,进入下一次循环,下一个循环里的 Scan 继续解析剩余输入缓冲区的内容,如此循环
就是输入非法的字符,scan接收到了存在缓冲区,直接跳过当次非法字符,但把回车等后续多余的字符接着被代码循环接收了。这问题很常见,用bufio.NewReader判断输入的字符正不正确,然后转换格式比较好。你搜索go搜不到多少东西,但是你换成c语言去搜,就有很多解释了,这玩意就是c语言的。
根据简单的测试结果,像是逐字符解析的(具体未知,暂未找到相关文档),你试一下数字和字母的混合输入并变换一下顺序会发现:当解析到非数字时,抛出错误,解析到数字或连续数字时,获取数字并结束
可能这样更准确一些:按顺序解析字符的时候,解析失败,触发异常,进入下一次循环,下一个循环里的 Scan 继续解析剩余输入缓冲区的内容,如此循环