如何复制做什么去?

Vru*_*shi 32 go

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

  1. 再次运行
  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")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序与输入无关,仅打印"hi".有人可以纠正我在这里做错了什么吗?

谢谢.

Lin*_*ope 56

do..while可以更直接在Go被仿真用一个for循环使用bool与接种循环变量true.

for ok := true; ok; ok = EXPR { }
Run Code Online (Sandbox Code Playgroud)

或多或少直接等同于

do { } while(EXPR)
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下:

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:游乐场(带有dummied-out Stdin)

虽然,不可否认,在这种情况下,它可能是更清晰的整体,只是显式调用(标记)break,returnos.Exit在循环.


小智 13

做...在进行中可以是这样的:

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


Lan*_*der 12

当问到这个问题时,对于这个特定场景来说这是一个更好的答案(我很少知道这将是搜索Google"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")
    }
}
Run Code Online (Sandbox Code Playgroud)

for没有任何声明循环相当于while在其他类似C语言的循环.查看涵盖循环的Effective Go文档for.


小智 11

whileGo中的循环可以像这样简单:

  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!!!`)
        }
Run Code Online (Sandbox Code Playgroud)

  • @3ocene 不,不。你的推理是正确的。当我不久前对此答案发表第一次评论时,我可能只是错过了最后的条件。我的错 (3认同)
  • @VictorZamanian 有一个条件:“if number &gt;= 10 {break }”。出于所有意图和目的,最后带有条件中断的无限循环与“do..while”循环相同,这正是OP所要求的。 (2认同)