对于糟糕的头衔道歉,有人可以建议我一个更好的头衔。
我正在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:
}
}