Как копировать делать в то время как?
Я хочу, чтобы набор кода выполнялся до тех пор, пока пользователь явно не хочет выйти из функции. Например, когда пользователь запускает программу, он увидит 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")