web-dev-qa-db-fra.com

Comment faire pour répliquer en cours de route?

Je veux qu'un ensemble de code soit exécuté jusqu'à ce que l'utilisateur veuille explicitement quitter la fonction. Par exemple: lorsqu'un utilisateur exécute le programme, il verra 2 options:

  1. Courir à nouveau 
  2. Sortie

ceci sera réalisé en utilisant une structure de boîtier d'interrupteur. Ici, si l'utilisateur appuie sur 1, l'ensemble des fonctions associées à 1 s'exécutera et si l'utilisateur appuiera sur 2, le programme se terminera. Comment dois-je réaliser ce scénario dans Golang? En Java, je pense que cela pourrait être fait en utilisant la structure do While, mais go ne prend pas en charge la boucle Do While. Voici mon code que j'ai essayé mais cela va dans une boucle infinie:

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

Le programme, quelle que soit l’entrée, n’imprime que "hi". Quelqu'un pourrait-il me corriger s'il vous plaît ce que je fais ici?

Merci.

23
Vrushank Doshi

Lorsque cette question a été posée, il s'agissait d'une meilleure réponse pour ce scénario spécifique (je ne savais pas que ce serait le premier résultat lors de la recherche par Google de "do while loop golang"). Pour répondre à cette question de manière générique, veuillez consulter la réponse de @ LinearZoetrope ci-dessous .

Enveloppez votre fonction dans une boucle 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")
    }
}

Une boucle for sans déclaration équivaut à une boucle while dans d'autres langages de type C. Consultez la documentation Effective Go qui couvre la boucle for.

10
Lander

Un do..while peut être plus directement émulé dans Go avec une boucle for à l'aide d'une variable de boucle bool dotée de true.

for ok := true; ok; ok = EXPR { }

est plus ou moins directement équivalent à

do { } while(EXPR)

Donc dans votre cas:

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

Edit: Playground (avec un Stdin modifié)

Certes, dans ce cas, il est probablement plus clair d'appeler explicitement (étiqueté) break, return ou os.Exit dans la boucle.

47
LinearZoetrope

Le do ... pendant le go peut être ça:

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

une boucle while dans Go peut être aussi simple que cela:

  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!!!`)
        }
8
user3165213

Considez à utiliser "pour-pause" comme "do-while".

foo.go

package main

import (
        "fmt"
)

func main() {
        i := 0
        for {
                i++
                if i > 10 {
                        break
                }
                fmt.Printf("%v ", i)
        }
        fmt.Println()
}

Coquille

$ go run foo.go
1 2 3 4 5 6 7 8 9 10
3
ROY

Peut-être pas ce que vous cherchez, mais si vous essayez de faire quelque chose comme ça:

int i = 0;
while (i < 10) {
    cout << "incrementing i now" << endl;
    i++
}
cout << "done"

Vous devrez faire quelque chose comme ça au rendez-vous:

    var i = 0 
    fmt.Println(i)
    for {
            if i < 10 {
                    fmt.Println("incrementing i now")
                    i++ 
            } else {
                    break
            }   
    }   
    fmt.Println("done")
0
1N5818