Go语言中的交互式CLI开发:survey库简介

打印 上一主题 下一主题

主题 974|帖子 974|积分 2922

在构建命令行工具时,精良的用户交互体验至关紧张。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。github.com/AlecAivazis/survey/v2 是一个为 Go 语言设计的库,专门用于构建交互式的命令行界面。它提供了多种用户输入方式,让你的 CLI 工具变得更加易用和友爱。
一、survey 是什么?

survey 是一个 Go 库,旨在通过交互式提示收集用户输入。它提供了一组丰富的提示类型,包括文本输入、选择菜单、确认提示、多项选择等,极大地方便了开发者在命令行工具中实现用户交互。
主要功能:


  • 简单易用:几行代码即可实现复杂的用户交互逻辑。
  • 多种提示类型:支持文本输入、选择、确认、多选、密码输入等。
  • 验证机制:提供输入验证功能,确保用户输入的有效性。
  • 默认值与自界说:支持默认值和高度自界说的提示举动。
二、安装 survey

要在项目中使用 survey,起首需要安装它:
  1. go get -u github.com/AlecAivazis/survey/v2
复制代码
安装完成后,你可以在项目中导入它:
  1. import "github.com/AlecAivazis/survey/v2"
复制代码
三、使用示例

1. 简单文本输入

最底子的使用场景是从用户处收集文本输入。比如,我们想扣问用户的名字:
  1. package main
  2. import (
  3.     "fmt"
  4.     "github.com/AlecAivazis/survey/v2"
  5. )
  6. func main() {
  7.     var name string
  8.     prompt := &survey.Input{
  9.         Message: "What is your name?",
  10.     }
  11.     survey.AskOne(prompt, &name)
  12.     fmt.Printf("Hello, %s!\n", name)
  13. }
复制代码
在这个例子中,survey.Input 创建了一个文本输入提示,用户的输入将存储在 name 变量中。
2. 选择菜单

偶然间我们需要用户从一组选项中选择一个。这时可以使用 survey.Select:
  1. var color string
  2. prompt := &survey.Select{
  3.     Message: "Choose a color:",
  4.     Options: []string{"Red", "Blue", "Green", "Yellow"},
  5. }
  6. survey.AskOne(prompt, &color)
  7. fmt.Printf("You chose %s!\n", color)
复制代码
survey.Select 会展示一个菜单,用户可以使用上下箭头键进行选择。
3. 确认提示

在需要用户确认操纵时,可以使用 survey.Confirm:
  1. var confirm bool
  2. prompt := &survey.Confirm{
  3.     Message: "Do you want to proceed?",
  4. }
  5. survey.AskOne(prompt, &confirm)
  6. if confirm {
  7.     fmt.Println("Proceeding...")
  8. } else {
  9.     fmt.Println("Operation canceled.")
  10. }
复制代码
survey.Confirm 提供了一个简单的 yes/no 提示,适用于操纵确认。
4. 多项选择

如果需要用户选择多个选项,可以使用 survey.MultiSelect:
  1. var languages []string
  2. prompt := &survey.MultiSelect{
  3.     Message: "What programming languages do you know?",
  4.     Options: []string{"Go", "Python", "JavaScript", "Rust"},
  5. }
  6. survey.AskOne(prompt, &languages)
  7. fmt.Printf("You selected: %v\n", languages)
复制代码
在这个例子中,用户可以选择多个编程语言,结果将以切片形式存储。
5. 密码输入

对于敏感信息,如密码输入,可以使用 survey.Password,用户的输入不会表现在屏幕上:
  1. var password string
  2. prompt := &survey.Password{
  3.     Message: "Enter your password:",
  4. }
  5. survey.AskOne(prompt, &password)
  6. fmt.Println("Password received.")
复制代码
survey.Password 是处理用户输入敏感信息的抱负选择。
四、输入验证

survey 还支持对用户输入进行验证,以确保输入符合预期。比方,要求用户输入一个有效的电子邮件地址:
  1. package main
  2. import (
  3.     "fmt"
  4.     "github.com/AlecAivazis/survey/v2"
  5.     "strings"
  6. )
  7. func main() {
  8.     var email string
  9.     prompt := &survey.Input{
  10.         Message: "Enter your email:",
  11.     }
  12.     survey.AskOne(prompt, &email, survey.WithValidator(survey.Required), survey.WithValidator(func(val interface{}) error {
  13.         if str, ok := val.(string); ok {
  14.             if !strings.Contains(str, "@") {
  15.                 return fmt.Errorf("invalid email address")
  16.             }
  17.         }
  18.         return nil
  19.     }))
  20.     fmt.Printf("Email entered: %s\n", email)
  21. }
复制代码
在这里,我们使用了 survey.WithValidator 添加自界说验证函数,确保用户输入的内容是有效的电子邮件地址。
五、联合 Cobra 使用

survey 常常与 Cobra 联合使用,以创建更复杂的命令行应用程序。比方,你可以在 Cobra 命令的 Run 方法中调用 survey 提示,从而实现交互式的命令参数输入。
  1. package main
  2. import (
  3.     "fmt"
  4.     "github.com/spf13/cobra"
  5.     "github.com/AlecAivazis/survey/v2"
  6. )
  7. var rootCmd = &cobra.Command{
  8.     Use:   "myapp",
  9.     Short: "MyApp is an interactive CLI application",
  10.     Run: func(cmd *cobra.Command, args []string) {
  11.         var name string
  12.         var age int
  13.         namePrompt := &survey.Input{
  14.             Message: "What is your name?",
  15.         }
  16.         agePrompt := &survey.Input{
  17.             Message: "How old are you?",
  18.         }
  19.         survey.AskOne(namePrompt, &name)
  20.         survey.AskOne(agePrompt, &age)
  21.         fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
  22.     },
  23. }
  24. func main() {
  25.     rootCmd.Execute()
  26. }
复制代码
这个例子展示了怎样在 Cobra 命令中嵌入 survey,为用户提供交互式体验。
  
声明:本作品接纳署名-非贸易性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行允许,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表