在构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。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库简介的更多相关文章

  1. 在C语言中利用PCRE实现正则表达式

    1. PCRE简介 2. 正则表达式定义 3. PCRE正则表达式的定义 4. PCRE的函数简介 5. 使用PCRE在C语言中实现正则表达式的解析 6. PCRE函数在C语言中的使用小例子 1. P ...

  2. 让你提前认识软件开发(23):怎样在C语言中运行shell命令?

    第1部分 又一次认识C语言 怎样在C语言中运行shell命令? [文章摘要] Linux操作系统具备开源等诸多优秀特性,因此在很多通信类软件(主流开发语言为C语言)中,开发平台都迁移到了Linux上, ...

  3. 让你提前认识软件开发(19):C语言中的协议及单元測试演示样例

    第1部分 又一次认识C语言 C语言中的协议及单元測试演示样例 [文章摘要] 在实际的软件开发项目中.常常要实现多个模块之间的通信.这就须要大家约定好相互之间的通信协议,各自依照协议来收发和解析消息. ...

  4. 【编程开发】C语言中随机数rand使用注意事项

    [编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...

  5. R语言中常用包(二)

    数据导入 以下R包主要用于数据导入和保存数据 feather:一种快速,轻量级的文件格式.在R和python上都可使用readr:实现表格数据的快速导入.中文介绍可参考这里readxl:读取Micro ...

  6. Java语言中的面向对象特性总结

    Java语言中的面向对象特性 (总结得不错) [课前思考]  1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?  2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?  3. 你知 ...

  7. 【转】windows和linux中搭建python集成开发环境IDE

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  8. C语言中关于对目录的操作

    原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...

  9. C 语言中的指针和内存泄漏

    引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...

  10. C语言中 *.c和*.h文件的区别!

    C语言中 *.c和*.h文件的区别!  http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/        ...

随机推荐

  1. ComfyUI进阶篇:ComfyUI核心节点(一)

    ComfyUI进阶篇:ComfyUI核心节点(一) 前言: 学习ComfyUI是一场持久战.当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点.面对各种各样的工作流和复杂的节点种类,可 ...

  2. Servlet3.0+SpringBoot2.X注解Listener常用监听器

    监听器:应用启动监听器,会话监听器,请求监听器 作用: ServletContextListener 应用启动监听 HttpSessionLisener 会话监听 ServletRequestList ...

  3. acwing 875

    acwing875 题目大意:快速幂模板题 Train of thought 此题如果采用暴力的做法时间复杂度为0(n*b); n为样例的数目,b是幂 我们想要优化暴力的做法,首先样例的数量是没有办法 ...

  4. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源

    1. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向和转发,以及访问静态资源 @ 目录 1. Spring MVC 中视图的实现原理,在Spring MVC 中实现重定向 ...

  5. 1. CMake 概述

    1. CMake 概述 CMake 可以用来构建C/C++工程,可以跨平台.允许开发者指定整个工程的编译流程 在CMake 没有出来之前,开发者需要手写 makefile,但是不同平台下的 makef ...

  6. 3.5 Y84-64的流水线实现

    我们终于准备好要开始本章的主要任务--设计一个流水线化的Y86-64处理器.首先,对顺序的SEQ处理器做一点小的改动,将PC的计算挪到取指阶段.然后,在各个阶段之间加上流水线寄存器.到这个时候,我们的 ...

  7. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”

    1. Spring MVC 中的拦截器的使用"拦截器基本配置" 和 "拦截器高级配置" @ 目录 1. Spring MVC 中的拦截器的使用"拦截器 ...

  8. mysql Using join buffer (Block Nested Loop) join连接查询优化

    最近在优化链表查询的时候发现就算链接的表里面不到1w的数据链接查询也需要10多秒,这个速度简直不能忍受 通过EXPLAIN发现,extra中有数据是Using join buffer (Block N ...

  9. 【SQL】Lag/Rank/Over窗口函数揭秘,数据分析之旅

    七月的夏日,阳光如火,但小悦的心中却是一片清凉与激情.在数据分析项目组的新岗位上,她仿佛找到了自己新的舞台,这里让她得以将深厚的后端技术实力与数据分析的精髓深度融合.每天,她都沉浸在业务需求的分析与数 ...

  10. windows中新建文件菜单消失的解决办法

    具体解决办法: https://jingyan.baidu.com/article/cbcede07577f4702f40b4dfd.html 右键中新建文本文件 菜单消失: 注册表编辑器: 路径: ...