如何复制 do while in go?

新手上路,请多包涵

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

  1. 再次运行
  2. 出口

这将使用开关盒结构来实现。这里如果用户按下 1,将执行与 1 关联的一组函数,如果用户按下 2,程序将退出。我应该如何在 golang 中实现这种情况?在 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”。有人可以纠正我在这里做错了什么吗?

谢谢。

原文由 Vrushank Doshi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 664
2 个回答

当这个问题被问到时,这是 针对这个特定场景 的更好答案(我几乎不知道这将是在谷歌搜索“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 循环等同于其他类 C 语言中的 while 循环。查看涵盖 for 循环的 Effective Go 文档

原文由 Lander 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

编辑: 游乐场(带有虚拟标准输入)

虽然,不可否认,在这种情况下,在循环中明确调用(标记) breakreturnos.Exit -6b921 可能总体上更清楚

原文由 Linear 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏