Go语言中的交互式CLI开发:survey库简介
在构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。github.com/AlecAivazis/survey/v2
是一个为 Go 语言设计的库,专门用于构建交互式的命令行界面。它提供了多种用户输入方式,让你的 CLI 工具变得更加易用和友好。
一、survey
是什么?
survey
是一个 Go 库,旨在通过交互式提示收集用户输入。它提供了一组丰富的提示类型,包括文本输入、选择菜单、确认提示、多项选择等,极大地方便了开发者在命令行工具中实现用户交互。
主要功能:
- 简单易用:几行代码即可实现复杂的用户交互逻辑。
- 多种提示类型:支持文本输入、选择、确认、多选、密码输入等。
- 验证机制:提供输入验证功能,确保用户输入的有效性。
- 默认值与自定义:支持默认值和高度自定义的提示行为。
二、安装 survey
要在项目中使用 survey
,首先需要安装它:
go get -u github.com/AlecAivazis/survey/v2
安装完成后,你可以在项目中导入它:
import "github.com/AlecAivazis/survey/v2"
三、使用示例
1. 简单文本输入
最基础的使用场景是从用户处收集文本输入。比如,我们想询问用户的名字:
package main
import (
"fmt"
"github.com/AlecAivazis/survey/v2"
)
func main() {
var name string
prompt := &survey.Input{
Message: "What is your name?",
}
survey.AskOne(prompt, &name)
fmt.Printf("Hello, %s!\n", name)
}
在这个例子中,survey.Input
创建了一个文本输入提示,用户的输入将存储在 name
变量中。
2. 选择菜单
有时候我们需要用户从一组选项中选择一个。这时可以使用 survey.Select
:
var color string
prompt := &survey.Select{
Message: "Choose a color:",
Options: []string{"Red", "Blue", "Green", "Yellow"},
}
survey.AskOne(prompt, &color)
fmt.Printf("You chose %s!\n", color)
survey.Select
会展示一个菜单,用户可以使用上下箭头键进行选择。
3. 确认提示
在需要用户确认操作时,可以使用 survey.Confirm
:
var confirm bool
prompt := &survey.Confirm{
Message: "Do you want to proceed?",
}
survey.AskOne(prompt, &confirm)
if confirm {
fmt.Println("Proceeding...")
} else {
fmt.Println("Operation canceled.")
}
survey.Confirm
提供了一个简单的 yes/no
提示,适用于操作确认。
4. 多项选择
如果需要用户选择多个选项,可以使用 survey.MultiSelect
:
var languages []string
prompt := &survey.MultiSelect{
Message: "What programming languages do you know?",
Options: []string{"Go", "Python", "JavaScript", "Rust"},
}
survey.AskOne(prompt, &languages)
fmt.Printf("You selected: %v\n", languages)
在这个例子中,用户可以选择多个编程语言,结果将以切片形式存储。
5. 密码输入
对于敏感信息,如密码输入,可以使用 survey.Password
,用户的输入不会显示在屏幕上:
var password string
prompt := &survey.Password{
Message: "Enter your password:",
}
survey.AskOne(prompt, &password)
fmt.Println("Password received.")
survey.Password
是处理用户输入敏感信息的理想选择。
四、输入验证
survey
还支持对用户输入进行验证,以确保输入符合预期。例如,要求用户输入一个有效的电子邮件地址:
package main
import (
"fmt"
"github.com/AlecAivazis/survey/v2"
"strings"
)
func main() {
var email string
prompt := &survey.Input{
Message: "Enter your email:",
}
survey.AskOne(prompt, &email, survey.WithValidator(survey.Required), survey.WithValidator(func(val interface{}) error {
if str, ok := val.(string); ok {
if !strings.Contains(str, "@") {
return fmt.Errorf("invalid email address")
}
}
return nil
}))
fmt.Printf("Email entered: %s\n", email)
}
在这里,我们使用了 survey.WithValidator
添加自定义验证函数,确保用户输入的内容是有效的电子邮件地址。
五、结合 Cobra
使用
survey
常常与 Cobra
结合使用,以创建更复杂的命令行应用程序。例如,你可以在 Cobra
命令的 Run
方法中调用 survey
提示,从而实现交互式的命令参数输入。
package main
import (
"fmt"
"github.com/spf13/cobra"
"github.com/AlecAivazis/survey/v2"
)
var rootCmd = &cobra.Command{
Use: "myapp",
Short: "MyApp is an interactive CLI application",
Run: func(cmd *cobra.Command, args []string) {
var name string
var age int
namePrompt := &survey.Input{
Message: "What is your name?",
}
agePrompt := &survey.Input{
Message: "How old are you?",
}
survey.AskOne(namePrompt, &name)
survey.AskOne(agePrompt, &age)
fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
},
}
func main() {
rootCmd.Execute()
}
这个例子展示了如何在 Cobra
命令中嵌入 survey
,为用户提供交互式体验。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特
Go语言中的交互式CLI开发:survey库简介的更多相关文章
- 在C语言中利用PCRE实现正则表达式
1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...
- 让你提前认识软件开发(23):怎样在C语言中运行shell命令?
第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...
- 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例
第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- R语言中常用包(二)
数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...
- Java语言中的面向对象特性总结
Java语言中的面向对象特性 (总结得不错) [课前思考] 1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类? 2. 面向对象编程的特性有哪三个?它们各自又有哪些特性? 3. 你知 ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
- C语言中关于对目录的操作
原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- C语言中 *.c和*.h文件的区别!
C语言中 *.c和*.h文件的区别! http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/ ...
随机推荐
- python3 podman库
前言 最近在使用 podman, 需要调用一些 podman的接口,podman官网提供的接口并不是很详尽,使用 unix.sock 的方式调用有一 些困难.后来测试 ai 工具时,其提供了一个比较好 ...
- 记一次win10 python -m http.server 启动后无法访问的经历
前言 最近需要在win10上使用python创建一个http文件服务(默认端口 8000),结果执行了 python3 -m http.server -b 0.0.0.0 后,发现服务跑起来了,但浏览 ...
- windows server + iis 部署若伊前端vue项目
一.背景说明 工作原因,一直使用若伊前后端分离版框架进行二次开发.客户的服务器多数为windows server系统,少部分为linux系统.过去一直是使用nginx进行前端的部署,nginx的代理功 ...
- Spring学习篇
什么是Spring? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求. 常见的配置方式 ...
- 「悬浮捷径SoftCircle」安卓平台的hao123,一键打开万物
罗老师的onestep一步发布之前, 终端的打开形式还拘泥于桌面和负一屏 这种方式够简洁,但缺点明显: 1.入口单一性:只能在app首页和各种扫一扫之间选择和切换 2.操作复杂:入口切换需要频繁的进入 ...
- SSRF结合Redis未授权的打法
目录 SSRF + Redis未授权 案例 怎么构造 redis 数据包? Reference SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称S ...
- 如何在 XAMPP 中使用 不同的 PHP 版本?
你有没有碰到这种情况,你工作的项目需要的是PHP8,而你自己的项目需要的是PHP7,而你又特别钟爱于XAMPP,奈何它却不能自由切换PHP版本,下面就讲下本人在用的方法将PHP7更新到PHP8,可以通 ...
- 基于Java:流浪动物领养信息系统设计实现(源码+lw+部署文档+讲解等)
\n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件 ...
- [oeasy]python0010_怎么用命令行保存文件
编写 py 文件 回忆上次内容 上次 真的输出了 程序员的浪漫 Hello world! print函数 可以输出 字符串 但是 print这个词 别拼错 就连 大小写 也别能错 错了就改 也没事 ...
- 记一次 redis 事件注册不当导致的内存泄露
线上的程序跑着跑着内存越来越大,并且没有下降的趋势,重启一下程序也只能短暂恢复.通过 htop 命令再按一下 M 键按内存占用大小排个序,程序会占好几个G.那好,让我们来分析一下. 收集dump 通过 ...