如何在Go中复制do while?

问题描述 投票:0回答:8

我想要执行一组代码,直到用户明确想要退出该函数。例如,当用户运行该程序时,他会看到 2 个选项:

  1. 再跑一次
  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”。有人可以纠正我在这里做错了什么吗?

谢谢。

for-loop go while-loop
8个回答
93
投票

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
可能总体上更清晰。


19
投票

Go 中的 do...while 可以是这样的:

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

16
投票

当这个问题被问到时,这是一个更好的答案对于这个特定的场景(我几乎不知道这将是在谷歌搜索“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
 循环。


14
投票
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!!!`) }



4
投票

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



2
投票

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")



1
投票
说明:

基本的 for 循环由三个部分组成,用分号分隔:

-init 语句:在第一次迭代之前执行。

-条件表达式:在每次迭代之前评估

-post 语句:在每次迭代结束时执行

init 和 post 语句是可选的。

所以你可以直接输入条件表达式。

// While (CONDITION = true){ //code to execute ....} //In go : for CONDITION = true { //code to execute}



1
投票

num := 10 for num > 0 { // do stuff here num-- }

	
© www.soinside.com 2019 - 2024. All rights reserved.