我希望执行一组代码,直到用户显式想要退出函数.例如:当用户运行程序时,他将看到两个选项:

  1. 再跑一次
  2. 出口

这将通过使用switch 盒 struct 来实现.这里,如果用户按1,将执行与1相关的一组功能,如果用户按2,程序将退出.我应该如何在golang实现这种情况?在java中,我相信这可以使用do while struct 完成,但go不支持do while循环.以下是我的代码,我try 过,但这是一个无限循环:

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.出口(2)
        default:
            fmt.Println("def")
        }
    }
}

程序不考虑输入,只打印"hi".有没有人能帮我纠正一下,我在这里做错了什么?

谢谢.

推荐答案

当这个问题被问到时,这是一个更好的答案for this specific scenario(当我在谷歌上搜索"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.

Go相关问答推荐

向路由发送获取请求时Golang中出现404错误

如何在定制普罗米修斯出口商中测试动态计量注册?

向API网关终结点发出POST请求时出现AWS Lambda With Go:";Rune me.InvalidEntrypoint";错误

正在使用terratest执行terraform脚本测试,但遇到错误退出状态1

在不耗尽资源的情况下处理S3文件下载

你能把用户界面文件中的GTK4应用程序窗口添加到GTK4应用程序中吗?

将类型定义为泛型类型实例化

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

戈姆:如何将一对一联系起来?

如何在Golang中覆盖404

如何将任何类型的数据值传递到 Golang 中的 GRPC Protobuf struct ?

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

用于提取 <*n 的正则表达式(其中 n 是一个数字)

Go 中的 Azure JWT 验证不起作用

在密钥不存在时处理 PATCH 部分更新

go version -m 输出中的箭头符号=>是什么意思?

Golang API 的 HTTPS

Dynamodb.ScanInput - 不能使用expr.Names()(类型 map[string]*string)作为类型 map[string]string

如何使用 fyne 避免 GUI 应用程序中的循环依赖?

在 etcd 键值存储中禁用历史记录