如何阻止用户继续在Golang

rqmkfv5c  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(101)

我想阻止用户输入大于5且小于1的数字
我该怎么做?

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main()  {

    fmt.Println("Please rate our pizza between 1 and 5")

    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')

    fmt.Println("Yourr rate is: ", input)
    convertedInput, err := strconv.ParseFloat(strings.TrimSpace(input), 64)

    if convertedInput > 5 || convertedInput < 1 {
        fmt.Println("you should rate between 1 to 5")

        ####want to stop program here

    }else {
        fmt.Println(convertedInput)
    }

    if err != nil {
        fmt.Println(err)
    }else {
        fmt.Println("your rate is: ", convertedInput)
    }
    
}
p8h8hvxi

p8h8hvxi1#

您可以从main函数return停止程序执行。

if convertedInput > 5 || convertedInput < 1 {
        fmt.Println("you should rate between 1 to 5")
        return
    }

或者,如果你想返回一个非零的退出代码来表示错误,你可以使用os.Exit。这可能适合您,因为程序没有成功。

import (
 ....
 "os"
)
...

    if convertedInput > 5 || convertedInput < 1 {
        fmt.Println("you should rate between 1 to 5")
        os.Exit(1)
    }

最后,您可以使用panic,这将转储堆栈跟踪。这不适合这种情况,因为它是用户输入的错误,而不是您可以使用堆栈跟踪调试的编程错误。但它将 * 结束程序。
也许你更愿意反复询问用户,直到他们提供一个有效的答案。为此,使用for循环。这是一种方法:

func main()  {

    for {
        fmt.Println("Please rate our pizza between 1 and 5")

        input, _ := reader.ReadString('\n')

        fmt.Println("Yourr rate is: ", input)
        convertedInput, err := strconv.ParseFloat(strings.TrimSpace(input), 64)
        if convertedInput > 5 || convertedInput < 1 {
            fmt.Println("you should rate between 1 to 5")
            continue
        }
        fmt.Println(convertedInput)

        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println("your rate is: ", convertedInput)
        }
        break
    }
    
}

更详细地回顾这段代码,

input, _ := reader.ReadString('\n')

我建议不要忽略错误。你不知道input是什么。Try the code on the playground to see how that causes unexpected behavior.
下面是:

convertedInput, err := strconv.ParseFloat(strings.TrimSpace(input), 64)

    if convertedInput > 5 || convertedInput < 1 {
        fmt.Println("you should rate between 1 to 5")

        ####want to stop program here

    }else {
        fmt.Println(convertedInput)
    }

    if err != nil {
        fmt.Println(err)
    }else {
        fmt.Println("your rate is: ", convertedInput)
    }

这些条件的顺序很有趣。在检查关联的err之前先检查convertedInput。我会这样做:

if convertedInput, err := strconv.ParseFloat(strings.TrimSpace(input), 64); err != nil {
        fmt.Println("Error converting input to Float: %s", err.Error())
    } else if convertedInput > 5 || convertedInput < 1 {
        fmt.Println("you should rate between 1 to 5")
        ## Do whatever ending / looping
    }else {
        fmt.Println("your rate is: ", convertedInput)
    }

这样,如果ParseFloat成功,您只会检查convertedInput
最后

相关问题