当输入多个字母作为输入时,循环多次打印语句 - GoLang

Loop prints statement multiple times when entering multiple letters as input - GoLang

我是 GoLang 的新手,我有一个问题,如果我输入多个字母作为输入,结果将打印多次。

用户需要键入一个非 0 且非字母的数字。 如果您键入一个字母,变量 'num1' 将为“0”(通过打印变量进行检查)

如果用户键入“0”或字母,他将再次尝试输入数字。

示例: 如果我输入“d”,它将按原样打印一次。 如果我键入“dd”,它将打印两次。 如果我键入“ddd”,它将打印三次。 但是,如果我输入“0”或“00”,它将只打印一次。

我怎样才能做到,如果我输入多个字母,结果总是打印一次?

代码:

package main

import "fmt"

func main() {

    var num1 float64

    for {

        fmt.Print("\nFirst Number: ")
        fmt.Scanln(&num1)

        if num1 == 0 {
            fmt.Print("Invalid input for 'First Number'")

        } else {
        break
        }
    }
    fmt.Print("passed")
} 

PS: 如果可能,变量 num1 应保留为 'float64'

感谢帮助^^

您面临的问题是 fmt.Scan 当无法将字符串转换为浮点数时,未扫描的位保留在缓冲区中。您可以尝试通过实际阅读并忽略它来清除缓冲区。

func main() {
    var num1 float64
    stdin := bufio.NewReader(os.Stdin)

    for {

        fmt.Print("\nFirst Number: ")
        fmt.Scan(&num1)
        if num1 == 0 {
            stdin.ReadString('\n')
            fmt.Print("Invalid input for 'First Number'")
        } else {
            break
        }
    }

    fmt.Print("passed")
}

我会推荐另一种方法,我像这样从字符串中手动解析浮点数:

func main() {
    var num1 float64

    for {
        var input string
        var err error

        fmt.Print("\nFirst Number: ")
        fmt.Scan(&input)
        num1, err = strconv.ParseFloat(input, 64)
        if err != nil {
            fmt.Print("Invalid input for 'First Number'")
        }

        if num1 == 0 {
            fmt.Print("Invalid input for 'First Number'")
        } else {
            break
        }
    }

    fmt.Print("passed")
}

并始终确保阅读错误并理解它们。