Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Parameter baris perintah dalam program Golang tidak diterima dengan betul sebagai parameter

Parameter baris perintah dalam program Golang tidak diterima dengan betul sebagai parameter

王林
王林ke hadapan
2024-02-09 09:09:13887semak imbas

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

Apabila editor php Baicao sedang membangunkan program Golang, dia kadangkala menghadapi masalah bahawa parameter baris arahan tidak diterima dengan betul sebagai parameter. Masalah ini boleh menyebabkan program tidak berjalan dengan betul atau mendapatkan data input yang betul. Untuk menyelesaikan masalah ini, kita perlu menyemak dengan teliti bahagian pemprosesan parameter baris arahan program untuk memastikan bahawa parameter diterima dengan betul dan digunakan dengan betul dalam program. Artikel ini akan memperkenalkan beberapa punca dan penyelesaian ralat biasa untuk membantu pembangun mengendalikan parameter baris arahan dengan lebih baik.

Kandungan soalan

Saya baru mengenali golang dan mengikuti tutorial dalam talian untuk membuat aplikasi kuiz mudah menggunakan terminal baris arahan. Walau bagaimanapun, apabila saya menjalankan kod pada mesin saya, selepas soalan pertama, baki soalan datang secara berpasangan, dan ia tidak lagi menerima jawapan saya untuk setiap soalan.

Contoh tangkapan skrin:

Proses program sangat mudah -

  1. Masalah mendapatkan input daripada fail csv tempatan
  2. Cetak setiap soalan dan terima jawapan yang dimasukkan pengguna
  3. Kekalkan kiraan jawapan yang betul dan paparkannya pada penghujung.

fail csv juga sangat pendek -

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

Ini adalah program lengkap -

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

Saya mencuba setiap baris kod tetapi tidak dapat menyelesaikannya. Bolehkah seseorang menunjukkan apa yang saya lakukan salah?

Penyelesaian

Saya boleh mengeluarkan semula isu pada tingkap (berjalan masuk 命令提示符). Tetapi pada linux tidak ada masalah.

Perubahan berikut akan menyelesaikan isu:

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

Ini adalah isu yang diketahui, dilaporkan sebagai fmt: scanf berfungsi secara berbeza pada windows dan linux #23562 Terdapat satu lagi pembaikan belum selesai. Malangnya, cl mempunyai ulasan yang tidak dapat diselesaikan dan telah disekat untuk masa yang lama.

Atas ialah kandungan terperinci Parameter baris perintah dalam program Golang tidak diterima dengan betul sebagai parameter. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam