我希望在用户明确要退出该函数之前执行一组代码。例如:当用户运行程序时,他将看到2个选项:
这将使用开关盒结构实现。这里如果用户按下1,将执行与1相关联的功能组,如果用户按下2,程序将退出。我应该如何在golang中实现这个场景?在java中,我相信这可以使用do while结构完成但是不支持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”。有人可以纠正我在这里做错了吗?
感谢。
答案 0 :(得分:50)
使用带有do..while
种子的bool
循环变量,可以使用for循环在Go中更直接地模拟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")
}
}
编辑:Playground(带有dummied-out Stdin)
但是,诚然,在这种情况下,在循环中明确调用(标记为)break
,return
或os.Exit
可能更为清晰。
答案 1 :(得分:13)
当问到这个问题时,对于这个特定场景,这是一个更好的答案(我很少知道在搜索Google“do while loop golang”时这将是第一个结果)。要一般性地回答这个问题,请参阅@LinearZoetrope's answer below。
将你的函数包含在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
循环。查看涵盖for
循环的Effective Go documentation。
答案 2 :(得分:11)
Go中的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!!!`)
}
答案 3 :(得分:9)
do ... while in go可以是这样的:
func main() {
var value int
for {
value++
fmt.Println(value)
if value%6 != 0 {
break
}
}
}
答案 4 :(得分:3)
考虑使用&#34; for-break&#34; as&#34; do-while&#34;。
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
答案 5 :(得分:0)
也许不是您正在寻找的东西,但如果您尝试做这样的事情:
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")
答案 6 :(得分:0)
sum := 1
for sum < 1000 {
sum += sum
}
说明:
基本的for循环具有由分号分隔的三个组件:
-init语句:在第一次迭代之前执行。
-条件表达式:在每次迭代之前求值
-post语句:在每次迭代结束时执行
init和post语句是可选的。
因此您只需放入条件表达式即可。
// While (CONDITION = true){
//code to execute ....}
//In go :
for CONDITION = true {
//code to execute}
答案 7 :(得分:0)
这是最干净的方法之一:
num := 10
for num > 0 {
// do stuff here
num--
}