Как разбить л oop в Golang - PullRequest
       4

Как разбить л oop в Golang

1 голос
/ 30 апреля 2020

Я изучаю программирование, используя Go. Следующая программа должна постоянно отображать меню, пока не будет выбрано 0. Текущее поведение: если первый выбор пользователя - 0, l oop прерывается. Если в первый раз выбор был 1, 2 или 3, во второй раз при выборе 0 l oop не прерывается. Что я делаю не так?

            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 ]

1 голос
/ 30 апреля 2020

Просто удалите для l oop в функции принятия решения.

Всякий раз, когда ваша функция принятия решения работает, если значение не равно 0, она вызывает main, но l oop для этого вызова функции определения все еще выполняется. Таким образом, в следующий раз, когда передается 0, ничего не запускается для второго вызова решающей функции, поэтому он завершается. Обратите внимание, что l oop для первого вызова все еще выполняется (в этом вызове переданное значение соответствует тому, что было передано пользователем в первый раз), следовательно, ваш l oop никогда не завершается.

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...
    }
}


1 голос
/ 30 апреля 2020

Вы не должны называть "main" изнутри a для l oop вот так; когда вы делаете это, вы снова запрашиваете пользовательский ввод, но вызывающий код по-прежнему равен l oop, поэтому он продолжит его снова. Вы должны просто удалить это "for" l oop (и также "break testL oop").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...