packagemainimport("bufio""fmt""os""strings")// StringPrompt asks for a string value using the labelfuncStringPrompt(labelstring)string{varsstringr:=bufio.NewReader(os.Stdin)for{fmt.Fprint(os.Stderr,label+" ")s,_=r.ReadString('\n')ifs!=""{break}}returnstrings.TrimSpace(s)}funcmain(){name:=StringPrompt("What is your name?")fmt.Printf("Hello, %s!\n",name)}
如何实现密码输入提示
密码提示与文本输入提示类似,区别在于用户输入的内容应该被隐藏:
packagemainimport("fmt""os""syscall""golang.org/x/term")// PasswordPrompt asks for a string value using the label.// The entered value will not be displayed on the screen// while typing.funcPasswordPrompt(labelstring)string{varsstringfor{fmt.Fprint(os.Stderr,label+" ")b,_:=term.ReadPassword(int(syscall.Stdin))s=string(b)ifs!=""{break}}fmt.Println()returns}funcmain(){password:=PasswordPrompt("What is your password?")fmt.Printf("Oh, I see! Your password is %q\n",password)}
如何实现“是/否”提示
对于“是/否”提示,我们将创建一个无限循环,不断询问直到用户回答“是”或“否”为止:
packagemainimport("bufio""fmt""os""strings")// YesNoPrompt asks yes/no questions using the label.funcYesNoPrompt(labelstring,defbool)bool{choices:="Y/n"if!def{choices="y/N"}r:=bufio.NewReader(os.Stdin)varsstringfor{fmt.Fprintf(os.Stderr,"%s (%s) ",label,choices)s,_=r.ReadString('\n')s=strings.TrimSpace(s)ifs==""{returndef}s=strings.ToLower(s)ifs=="y"||s=="yes"{returntrue}ifs=="n"||s=="no"{returnfalse}}}funcmain(){ok:=YesNoPrompt("Dev.to is awesome!",true)ifok{fmt.Println("Agree!")}else{fmt.Println("Huh?")}}
packagemainimport("fmt""strings""github.com/AlecAivazis/survey/v2")funcCheckboxes(labelstring,opts[]string)[]string{res:=[]string{}prompt:=&survey.MultiSelect{Message:label,Options:opts,}survey.AskOne(prompt,&res)returnres}funcmain(){answers:=Checkboxes("Which are your favourite programming languages?",[]string{"C","Python","Java","C++","C#","Visual Basic","JavaScript","PHP","Assembly Language","SQL","Groovy","Classic Visual Basic","Fortran","R","Ruby","Swift","MATLAB","Go","Prolog","Perl",},)s:=strings.Join(answers,", ")fmt.Println("Oh, I see! You like",s)}
注意事项和变通方法
如果您将一些输入数据通过管道传递给交互式 CLI 应用程序,提示符将读取这些数据:
$echo"Petr" | go run main.go
What is your name? Hello, Petr!
packagemainimport("fmt""syscall""golang.org/x/term")funcmain(){ifterm.IsTerminal(int(syscall.Stdin)){fmt.Println("Terminal is interactive! You're good to use prompts!")}else{fmt.Println("Terminal is not interactive! Consider using flags or environment variables!")}}
$echo"Hello" | go run main.go
Terminal is not interactive! Consider using flags or environment variables!
$go run main.go
Terminal is interactive! You're good to use prompts!
twitterID:=prompter.Prompt("Enter your twitter ID", "")
lang:=prompter.Choose("Which language do you like the most?", []string{"Perl", "Golang", "Scala", "Ruby"}, "Perl")
passwd:=prompter.Password("Enter your password")
varlikeSushibool=prompter.YN("Do you like sushi?", true)
varlikeBeerbool=prompter.YesNo("Do you like beer?", false)