我想要执行一组代码,直到用户明确想要退出该函数。例如,当用户运行该程序时,他会看到 2 个选项:
这将使用
switch case
结构来实现。在这里,如果用户按下 1
,将执行与 1
相关的一组功能,如果用户按下 2
,程序将退出。我应该如何在 Go 中实现这个场景?
在 Java 中,我相信这可以使用
do while()
结构来完成,但 Go 不支持 do 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")
}
}
}
无论输入如何,程序都只打印“hi”。有人可以纠正我在这里做错了什么吗?
谢谢。
A
do..while
可以使用以 bool
为种子的 true
循环变量在 Go 中通过 for 循环更直接地进行模拟。
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")
}
}
编辑:Playground(带有虚拟标准输入)
不过,诚然,在这种情况下,在循环中显式调用(标记为)
break
、return
或os.Exit
可能总体上更清晰。
Go 中的 do...while 可以是这样的:
func main() {
var value int
for {
value++
fmt.Println(value)
if value%6 != 0 {
break
}
}
}
当这个问题被问到时,这是一个更好的答案对于这个特定的场景(我几乎不知道这将是在谷歌搜索“do whileloop golang”时的#1结果)。要一般性地回答这个问题,请参阅下面@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
循环相当于其他类 C 语言中的
while
循环。查看Effective Go 文档,其中涵盖了
for
循环。
while
循环可以像这样简单:
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!!!`)
}
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
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")
说明:
基本的 for 循环由三个部分组成,用分号分隔:
-init 语句:在第一次迭代之前执行。
-条件表达式:在每次迭代之前评估
-post 语句:在每次迭代结束时执行
init 和 post 语句是可选的。
所以你可以直接输入条件表达式。
// While (CONDITION = true){
//code to execute ....}
//In go :
for CONDITION = true {
//code to execute}
num := 10
for num > 0 {
// do stuff here
num--
}