在Golang中添加值到范围

时间:2018-05-10 05:22:12

标签: go

对于糟糕的头衔道歉,有人可以建议我一个更好的头衔。

我正在Golang中构建一个简单的flashcard应用程序。以下代码返回闪存卡的一侧,等待[ENTER],返回另一侧。

我希望包含一种方法来标记我忘记的某些卡片,将它们添加回范围,以便稍后在我的修订版会话中显示。这可以通过仅检查fmt.Scanln()

处的特定确定输入来完成

问题是,我还需要一个限制功能,就像我所包含的那样。 -n限制显示的卡片。只是将卡添加到地图可能不会将其添加到当前会话的内存中的n卡。

import (
    "encoding/csv"
    "flag"
    "fmt"
    "log"
    "math/rand"
    "os"
    "os/exec"
    "runtime"
    "time"

    "github.com/fatih/color"
)

var (
    flagNoColor = flag.Bool("no-color", false, "disable color output")
    csvPath = flag.String("src", "src.csv", "source")
    lang = flag.String("lang", "random", "language")
    num = flag.Int("n", -1, "number")
)

var clear map[string]func()

func init() {
    clear = make(map[string]func())
        clear["linux"] = func() {
        cmd := exec.Command("clear")
        cmd.Stdout = os.Stdout
        cmd.Run()
    }
    clear["windows"] = func() {
        cmd := exec.Command("cmd", "/c", "cls")
        cmd.Stdout = os.Stdout
        cmd.Run()
    }
}

func CallClear() {
    value, ok := clear[runtime.GOOS]
    if ok {
        value()
    } else {
        panic("Panic!")
    }
}

func random(min int, max int) int {
    return rand.Intn((max-min) + 1) + min
}

func main() {

    flag.Parse()

    file, err := os.Open(*csvPath)
    if err != nil {
        log.Println(err)
        return
    }
    defer file.Close()

    csvReader := csv.NewReader(file)

    csvData, err := csvReader.ReadAll()
    if err != nil {
        log.Println(err)
        return
    }

    qaPair := make(map[string]string, len(csvData))
    for _, data := range csvData {
        qaPair[data[0]] = data[1]
    }

    done := make(chan bool)
    breakF := make(chan bool)

    qNum := 0

    go func() {
        if *flagNoColor {
            color.NoColor = true
        }
        white := color.New(color.FgWhite)
        boldWhite := white.Add(color.Bold)

        for one, two := range qaPair {
            if qNum == *num {
                breakF <- true
            }
            rand.Seed(time.Now().UnixNano())
            randomNum := random(1, 2)
            CallClear()
            if *lang == "es" {
                randomNum = 1
            } else if *lang == "en" {
                randomNum = 2
            }
            qNum++
            boldWhite.Printf("\n #   %d / %d\n", qNum, len(qaPair))
            if randomNum == 1 {
                boldWhite.Printf("\n Q   %s", one)
                fmt.Scanln()
                boldWhite.Printf("\n A   %s", two)
                fmt.Scanln()
            } else {
                boldWhite.Printf("\n Q   %s", two)
                fmt.Scanln()
                boldWhite.Printf("\n A   %s", one)
                fmt.Scanln()
            }
            CallClear()
        }
        done <- true
    }()

    select {
        case <-done:
        case <-breakF:
    }

}

0 个答案:

没有答案