GoLang输入多个字母时循环多次打印错误提示如何解决?
问题根源
你遇到的重复提示问题本质是fmt.Scanln扫描失败时的缓冲区残留导致的:
当输入非数字字符时,fmt.Scanln匹配float64失败后,只会消耗第一个不匹配的字符,剩下的字符会留在标准输入缓冲区里。下一次循环执行Scanln时会直接读取缓冲区残留的字符,再次匹配失败,所以输入n个字符就会触发n次错误提示。
而输入0或者00的时候,Scanln可以正常把整行内容解析为0,一次性读完缓冲区所有内容,因此只会提示1次。
解决方法
要解决该问题只需在扫描失败时清空输入缓冲区的残留内容即可,完全保留num1的float64类型,修改后代码如下:
package main import ( "bufio" "fmt" "os" ) func main() { var num1 float64 // 初始化reader用来清空输入缓冲区 reader := bufio.NewReader(os.Stdin) for { fmt.Print("\nFirst Number: ") // 接收Scanln的返回值:成功扫描的参数数量、错误信息 _, err := fmt.Scanln(&num1) // 两种情况判定为输入非法:扫描出错、扫描结果为0 if err != nil || num1 == 0 { fmt.Println("Invalid input for 'First Number'") // 清空缓冲区剩余的整行内容,避免下次循环重复读取残留 if err != nil { _, _ = reader.ReadString('\n') } } else { break } } fmt.Print("passed") }
核心修改说明
- 新增接收
fmt.Scanln的错误返回值,主动识别输入不匹配的场景 - 输入不匹配时用
bufio.Reader一次性读取整行残留内容,清空缓冲区 - 全程保留
num1的float64类型,符合需求要求
内容的提问来源于stack exchange,提问作者ouzt
相关产品推荐
相关产品推荐

