如何复制do in go?

时间:2015-09-29 02:20:55

标签: go

我希望在用户明确要退出该函数之前执行一组代码。例如:当用户运行程序时,他将看到2个选项:

  1. 再次跑步
  2. 退出
  3. 这将使用开关盒结构实现。这里如果用户按下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”。有人可以纠正我在这里做错了吗?

    感谢。

8 个答案:

答案 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)

但是,诚然,在这种情况下,在循环中明确调用(标记为)breakreturnos.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--
}