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

news/2024/11/15 0:36:40/文章来源:https://www.cnblogs.com/lianshuiwuyi/p/18394377

在构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。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 mainimport ("fmt""github.com/AlecAivazis/survey/v2"
)func main() {var name stringprompt := &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 mainimport ("fmt""github.com/AlecAivazis/survey/v2""strings"
)func main() {var email stringprompt := &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 mainimport ("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 stringvar age intnamePrompt := &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: 恋水无意
腾讯云开发者社区:孟斯特


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791613.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排

专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排 1. 简介 1.1 RAG 在说重排工具之前,我们要先了解一下 RAG。 检索增强生成(RAG)是一种新兴的 …

Exchange 2016部署实施案例篇-02.活动目录部署篇

其实在写这篇博文之前纠结了好久,到底是该写部署1台AD演示下,还是部署2台活动目录那,比较这个专家还是以Exchang为主,但思来想去最终决定还是部署一主一辅吧,毕竟部署主与辅助还是稍微在步骤上有些不同的,废话不多说,接下来我们开始我们今天的话题,活动目录部署,请大家…

红米k70 pro澎湃os系统安装谷歌商店

第一步第二步 第三步 效果图

PA1-碎碎念

part 1 8.27 方便管理,主要是想熟悉下git的操作 先创建并且切换到一个新的分支: git commit --allow-empty -am "before starting PA1" git checkout -b PA1其中--allow-empty表示允许提交一个空的提交,git默认是不能提交一个空的提交信息,如果当前的文档没有什么…

闯关地图-进阶岛

第1关 在 CompassArena 中选择双模型对话,与InternLM2.5及另外任意其他模型对话,收集 5 个 InternLM2.5 输出结果不如其他模型的对话案例,以及 InternLM2.5 的 5 个 Good Case,并写成一篇飞书文档提交到:https://aicarrier.feishu.cn/share/base/form/shrcnZ4bQ4YmhEtMtnK…

PA1-总结

前言 代码全是自己写的,没看过参考代码,思路也有部分和指导书不一样,算是个原创?然后毕竟pa1是简单的部分,也没有什么值得骄傲的地方,只是作为一次记录。 毕竟自己的水平还是有限,可能部分地方会有些bug。自己成绩也不太好吧,程序设计不会,计算机系统基础说实话是0,只…

南沙信奥塞陈老师解一本通题:1409:判决素数个数

​【题目描述】 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y)。 【输入】 两个整数X和Y(1≤X,Y≤105)。#include <bits/stdc++.h> using namespace std; bool IsPrime(int n) {if(n<=1)return false;for(int i=2;i<=sqrt(n);i++)if(n%i==0)return fals…

win10更新为win11后OneNote笔记全部消失的完整解决方案

目录背景解决步骤1:下载OneNote for Windows10,找到笔记Here is the link to old OneNote for Windows 10 app解决步骤2:导出找到的笔记使用OneNote网页版导出笔记解决步骤3:导入找到的笔记至新版OneNote解决报错:直接copy一份副本至当前笔记本 背景 电脑更新为win11后,我…

远距离跨网络实现windows远程桌面连接

1.保证已经打开被连接电脑---远程访问---权限。 我的电脑--右键--属性--远程设置2.选择允许连接 (选择用户和高级没有特殊设置可以不动,被连接电脑当前登陆的账号就可以满足权限)3.打开--控制面板4.依次选择至当前位置,打开允许应用或功能通过防火墙5.勾选远程桌面专用网络…

使用 niljson 处理 Go 语言中 JSON 的空值类型

使用 niljson 处理 Go 语言中 JSON 的空值类型 原创 源自开发者 源自开发者2024年09月03日 11:43 广东 听全文源自开发者 专注于提供关于Go语言的实用教程、案例分析、最新趋势,以及云原生技术的深度解析和实践经验分享。 321篇原创内容公众号在使用Go语言进行JSON数据的序列化…

在本地通过Docker安装MySQL并配置持久化

看前须知 这里使用Mac下的OrbStack代替Docker,都是命令行操作,除了可能出现的UI不同外没有任何区别。 拉取镜像 由于是Mac环境,所以优先使用arm64结构,关于是否支持所需架构,可以在Docker Hub上查,一般支持的都会写明。 这里搜索MySQL,进入官方镜像就可以在Overview的Qu…

Mistral 大语言模型

Mistral AI Mistral AI team Mistral AI 是一家销售人工智能产品的法国公司。它由 Meta Platforms 和 Google DeepMind 的前员工于 2023 年 4 月创立。该公司于 2023 年 10 月筹集了 3.85 亿欧元,2023 年 12 月估值超过 20 亿美元Mistral.AI 愿景与使命 我们是一个具有高科学标…