如何打破Golang的循环

时间:2020-04-30 12:13:12

标签: go

我正在使用Go学习编程。以下程序应连续显示菜单,直到选择0。当前行为:如果用户的第一选择为0,则循环中断。如果第一次选择1、2或3,第二次选择0,则循环不会中断。我在做什么错了?

            package main
            import "fmt"

            func main() {
                multiline2 :=   "Welcome! Please make your choice: \n" +
                                "--------------------------------- \n" +
                                "1. Option One \n" +
                                "2. Option Two \n" +
                                "3. Option Three \n" +
                                "0. Exit \n" +
                                "----------------- \n" +
                                "Your Choice is: "
                fmt.Print(multiline2)
                var usersChoice int
                fmt.Scanln(&usersChoice)
                decider(usersChoice)
            }

            func decider(value int) {
                testLoop:for value > 0 {
                    switch value {
                    case 1:
                        fmt.Println("You Chose One, try again \n")
                        //break
                        main()
                    case 2:
                        fmt.Println("You Chose Two, try again \n")
                        //break
                        main()
                    case 3:
                        fmt.Println("You Chose Three, try again \n")
                        //break
                        main()
                    case 0:
                        fmt.Println("You Chose To Quit")
                        fmt.Println("Good Bye")
                        value = 0   // doesnt help...
                        break testLoop
                    }
                }
            }

更新后,这是工作代码,以防万一。
        package main
        import "fmt"

        func main() {
            starter()
        }

        func starter() {
            multiline2 :=   "Welcome! Please make your choice: \n" +
                            "--------------------------------- \n" +
                            "1. Option One \n" +
                            "2. Option Two \n" +
                            "3. Option Three \n" +
                            "0. Exit \n" +
                            "----------------- \n" +
                            "Your Choice is: "
            fmt.Print(multiline2)
            var usersChoice int
            fmt.Scanln(&usersChoice)
            decider(usersChoice)
        }

        func decider(value int) {
              //for value > 0 {
                switch value {
                case 1:
                    fmt.Println("You Chose One, try again \n")
                    starter()
                case 2:
                    fmt.Println("You Chose Two, try again \n")
                    starter()
                case 3:
                    fmt.Println("You Chose Three, try again \n")
                    starter()
                case 0:
                    fmt.Println("You Chose To Quit")
                    fmt.Println("Good Bye")
                    //value = 0
                    //break
                }
            //}
        }

2 个答案:

答案 0 :(得分:1)

您不应从这样的for循环内部调用“ main”;当您执行此操作时,您将再次要求用户输入,但是调用代码仍位于该循环中,因此它将继续运行。您应该只删除该“ for”循环(以及“ break testLoop”)。

答案 1 :(得分:1)

只需在决定函数中删除for循环即可。

每当值不为0的决策函数运行时,它将调用main,但该决策函数调用的循环仍在运行。因此,下次传递0时,对于决定者函数的第二次调用不执行任何操作,因此退出。请注意,第一次调用的循环仍在运行(在该调用中,传递的值是用户第一次传递的值),因此您的循环永远不会退出。

func decider(value int) {
    switch value {
    case 1:
        fmt.Println("You Chose One, try again \n")
        //break
        main()
    case 2:
        fmt.Println("You Chose Two, try again \n")
        //break
        main()
    case 3:
        fmt.Println("You Chose Three, try again \n")
        //break
        main()
    case 0:
        fmt.Println("You Chose To Quit")
        fmt.Println("Good Bye")
        value = 0 // doesnt help...
    }
}