Как копировать делать в то время как?

Я хочу, чтобы набор кода выполнялся до тех пор, пока пользователь явно не хочет выйти из функции. Например, когда пользователь запускает программу, он увидит 2 варианта:

  1. Запустить снова
  2. Выход

это будет достигнуто с использованием структуры корпуса коммутатора. Здесь, если пользователь нажимает 1, набор функций, связанных с 1, будет выполняться, и если пользователь нажмет 2, программа выйдет. Как мне достичь этого сценария в голанге? В java, я считаю, что это можно сделать, используя do while structure, но go не поддерживает цикл while. Ниже приведен мой код, который я пробовал, но это происходит в бесконечном цикле:

func sample() {
    var i = 1
    for i > 0 {
        fmt.Println("Press 1 to run")
        fmt.Println("Press 2 to exit")
        var input string
        inpt, _ := fmt.Scanln(&input)
        switch inpt {
        case 1:
            fmt.Println("hi")
        case 2:
            os.Exit(2)
        default:
            fmt.Println("def")
        }
    }
}

Программа, независимо от ввода, печатает только "привет". Может кто-то, пожалуйста, исправьте меня, что я здесь делаю неправильно?

Благодарю.

Ответ 1

Когда этот вопрос был задан, это был лучший ответ для этого конкретного сценария (мало ли я знаю, что это будет результатом №1 при поиске в Google для "do while loop golang"). Чтобы ответить на этот вопрос в общих чертах, см. Ниже ответ @LinearZoetrope.

Оберните свою функцию в цикл for:

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Println("Press 1 to run")
    fmt.Println("Press 2 to exit")
    for {
        sample()
    }
}

func sample() {
    var input int
    n, err := fmt.Scanln(&input)
    if n < 1 || err != nil {
         fmt.Println("invalid input")
         return
    }
    switch input {
    case 1:
        fmt.Println("hi")
    case 2:
        os.Exit(2)
    default:
        fmt.Println("def")
    }
}

for цикла без каких - либо деклараций эквивалентно в while циклы в других С-подобных языках. Ознакомьтесь с документацией Effective Go, которая охватывает цикл for.

Ответ 2

A do..while можно более эффективно эмулировать в Go с циклом for, используя переменную цикла bool засеваемую значением true.

for ok := true; ok; ok = EXPR { }

более или менее прямо эквивалентно

do { } while(EXPR)

Итак, в вашем случае:

var input int
for ok := true; ok; ok = (input != 2) {
    n, err := fmt.Scanln(&input)
    if n < 1 || err != nil {
        fmt.Println("invalid input")
        break
    }

    switch input {
    case 1:
        fmt.Println("hi")
    case 2:
        // Do nothing (we want to exit the loop)
        // In a real program this could be cleanup
    default:
        fmt.Println("def")
    }
}

Изменение: Игровая площадка (с манекеном Stdin)

Хотя, по общему признанию, в этом случае, вероятно, в целом яснее просто явно (помечено) break, return или os.Exit в цикле.

Ответ 3

в while цикл в Go может быть столь же легко, как это:

  package main

  import 'fmt'

      func main() {
        for {
          var number float64
          fmt.Print('insert an Integer eq or gr than 10!!!')
          fmt.Scanf('%f', &number)
          if number >= 10 { break }
          fmt.Println('sorry the number is lower than 10....type again!!!')
        }

Ответ 4

Делать... в то время как это может быть так:

func main() {
    var value int
    for {
        value++
        fmt.Println(value)
        if value%6 != 0 {
            break
        }
    }
}

Ответ 5

Conside использовать "for-break" как "do-while".

foo.go

package main

import (
        "fmt"
)

func main() {
        i := 0
        for {
                i++
                if i > 10 {
                        break
                }
                fmt.Printf("%v ", i)
        }
        fmt.Println()
}

оболочка

$ go run foo.go
1 2 3 4 5 6 7 8 9 10

Ответ 6

Возможно, не то, что вы ищете, но если вы пытаетесь сделать что-то вроде этого:

int i = 0;
while (i < 10) {
    cout << "incrementing i now" << endl;
    i++
}
cout << "done"

Вам нужно будет сделать что-то подобное в go:

    var i = 0 
    fmt.Println(i)
    for {
            if i < 10 {
                    fmt.Println("incrementing i now")
                    i++ 
            } else {
                    break
            }   
    }   
    fmt.Println("done")