Maison  >  Article  >  développement back-end  >  Les paramètres de ligne de commande dans le programme Golang ne sont pas correctement acceptés en tant que paramètres

Les paramètres de ligne de commande dans le programme Golang ne sont pas correctement acceptés en tant que paramètres

王林
王林avant
2024-02-09 09:09:13823parcourir

Golang 程序中命令行参数未正确接受作为参数

Lorsque l'éditeur php Baicao développe des programmes Golang, il rencontre parfois le problème que les paramètres de ligne de commande ne sont pas correctement acceptés comme paramètres. Ce problème peut empêcher le programme de fonctionner correctement ou d'obtenir des données d'entrée correctes. Afin de résoudre ce problème, nous devons vérifier soigneusement la partie traitement des paramètres de ligne de commande du programme pour nous assurer que les paramètres sont correctement reçus et utilisés correctement dans le programme. Cet article présentera quelques causes d'erreur courantes et des solutions pour aider les développeurs à mieux gérer les paramètres de ligne de commande.

Contenu de la question

Je suis nouveau sur Golang et je suis un tutoriel en ligne sur la création d'une application de quiz simple à l'aide d'un terminal de ligne de commande. Cependant, lorsque j'exécute le code sur ma machine, après la première question, les questions restantes arrivent par paires et elle n'accepte plus ma réponse pour chaque question.

Exemple de capture d'écran :

Le processus du programme est très simple -

  1. Problème pour obtenir les entrées du fichier csv local
  2. Imprimez chaque question et acceptez les réponses saisies par l'utilisateur
  3. Maintenez un décompte des réponses correctes et affichez-les à la fin.

le fichier csv est également très court -

70+22,92
63+67,130
91+72,163
74+61,135
81+6,87

Voici le programme complet -

package main

import (
    "encoding/csv"
    "flag"
    "fmt"
    "os"
    "time"
)

func main() {
    // 1. input the name of the file
    fName := flag.String("f", "quiz.csv", "path of csv file")
    // 2. set the duration of timer
    timer := flag.Int("t", 30, "timer for the quiz")
    flag.Parse()
    // 3. pull the problems from the file  (calling our problem puller)
    problems, err := problemPuller(*fName)
    // 4. handle the error
    if err != nil {
        exit(fmt.Sprintf("something went wrong: %s", err.Error()))
    }
    // 5. create a variable to count our correct answers
    correctAns := 0
    // 6. using the duration of the timer, we want to initialize the timer
    tObj := time.NewTimer(time.Duration(*timer) * time.Second)
    ansC := make(chan string)
    // 7. loop through the problems, print the questions, we'll accept the answers
    problemLoop: 
        for i, p := range problems {
            var answer string
            fmt.Printf("Problem %d: %s =", i+1, p.question)

            go func() {
                fmt.Scanf("%s", &answer)
                ansC <- answer
            }()
            select {
                case <- tObj.C:
                    fmt.Println()
                    break problemLoop
                case iAns := <- ansC:
                    if iAns == p.answer {
                        correctAns++
                    }
                    if i == len(problems)-1 {
                        close(ansC)
                    }
            }
        }
    // 8. calculate and print out the result
    fmt.Printf("Your result is %d out of %d\n", correctAns, len(problems))
    fmt.Printf("Press enter to exit")
    <- ansC
}

func problemPuller(fileName string) ([]problem, error) {
    // read all the problems from the quiz.csv

    // 1. open the file
    if fObj, err := os.Open(fileName); err == nil {
        // 2. we will create new reader
        csvR := csv.NewReader(fObj)
        // 3. it will need to read the file
        if cLines, err := csvR.ReadAll(); err == nil {
            // 4. call the parseProblem function
            return parseProblem(cLines), nil
        } else {
            return nil, fmt.Errorf("error in reading data in csv from %s file; %s", fileName, err.Error())
        }
    } else {
            return nil, fmt.Errorf("error in opening the file %s file; %s", fileName, err.Error())
    }
}

func parseProblem(lines [][]string) []problem {
    // go over the lines and parse them based on the problem struct
    r := make([] problem, len(lines))
    for i := 0; i < len(lines); i++ {
        r[i] = problem {
            question: lines[i][0],
            answer: lines[i][1],
        }
    }
    return r
}

type problem struct {
    question string
    answer   string
}

func exit(msg string) {
    fmt.Println(msg)
    os.Exit(1)
}

J'ai essayé chaque ligne de code mais je n'arrive pas à la résoudre. Quelqu'un peut-il signaler ce que je fais de mal ?

Solution de contournement

Je peux reproduire le problème sous Windows (exécuté sous 命令提示符). Mais sous Linux, il n'y a aucun problème.

Les modifications suivantes résoudront le problème :

go func() {
-   fmt.Scanf("%s", &answer)
+   fmt.Scanln(&answer)
    ansC <- answer
  }()

Il s'agit d'un problème connu, signalé sous le nom fmt : scanf fonctionne différemment sous Windows et Linux #23562 Il y a un autre correctif en attente. Malheureusement, cl a des commentaires non résolus et est bloqué depuis longtemps.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer