首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年09月03日 12:41

在构建命令行工具时,良好的用户交互体验至关重要。尤其是在需要与用户进行复杂输入的场景下,传统的命令行参数和标志可能显得笨拙。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: 恋水无意
腾讯云开发者社区:孟斯特


From:https://www.cnblogs.com/lianshuiwuyi/p/18394377
本文地址: http://www.shuzixingkong.net/article/1692
0评论
提交 加载更多评论
其他文章 地理围栏,打造智能生活新边界
随着智能手机和其他移动设备的普及,用户对基于位置获取个性化服务的需求大幅增加,例如用户进入商圈范围并停留操作一段时间后,智能触发向用户推送该商圈吃、喝、玩、乐的优惠活动消息;又如当用户到达非常驻地的机场时触发围栏,向用户推送询问是否需要预定机场附近的酒店的消息,从而第一时间洞悉用户潜在需求并提供相关
地理围栏,打造智能生活新边界 地理围栏,打造智能生活新边界
OpenFeign深入学习笔记
OpenFeign 是 Spring Cloud 生态系统中的一个强大工具,它使得微服务之间的通信变得更加简单和高效。通过使用 OpenFeign,开发者可以专注于业务逻辑的实现,而不需要关心底层的 HTTP 通信细节。
.NET 最好用的验证组件 FluentValidation
前言 一个 .NET 验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多语言。 项目介绍 FluentValidation 是一个开源的 .NET 库,用于验证对象的属性。 它提供了一种简单而强大的方式来定义和执行验证规则,使验证逻辑的
.NET 最好用的验证组件 FluentValidation .NET 最好用的验证组件 FluentValidation .NET 最好用的验证组件 FluentValidation
10 Python面向对象编程:类和对象以及和Java的对比
本篇是 Python 系列教程第 10 篇,更多内容敬请访问我的 Python 合集 这里只介绍类和对象,self、属性、方法、访问控制、类继承、方法重写在后面的文章里介绍 在Python中,类和对象是面向对象编程的基础。 1 类的概念 类是一种创建对象的蓝图或模板。它定义了一组属性(变量)和方法(
专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排
专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排
专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排 专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排 专业级语义搜索优化:利用 Cohere AI、BGE Re-Ranker 及 Jina Reranker 实现精准结果重排
STM32的bootloader探究
OTA OTA(Over-The-Air Technology,空中下载技术)是一种通过无线网络对设备进行远程升级的技术。这种技术最初在PC电脑和移动手机行业中得到应用,近年来在汽车行业中也得到了广泛的应用。 IAP:In-Application Programming (IAP) 是一种使微控制器
STM32的bootloader探究 STM32的bootloader探究 STM32的bootloader探究
开源问卷调查和考试系统 SurveyKing 安装和使用教程
最近公司又要搞什么满意度调查了,我这个小菜鸟又要头疼了。上次用那个破系统,界面丑不说,功能还少得可怜,搞得我加班到半夜。这回非得找个好用的不可。 正发愁呢,突然想起来前两天同事小王推荐了一个叫 “卷王” 的开源系统,这名字挺有意思的,我还以为是什么 “卷王” 专用的问卷系统呢,后来才知道,这个 “卷
开源问卷调查和考试系统 SurveyKing 安装和使用教程 开源问卷调查和考试系统 SurveyKing 安装和使用教程 开源问卷调查和考试系统 SurveyKing 安装和使用教程
WebShell流量特征检测_中国菜刀篇
80后用菜刀,90后用蚁剑,95后用冰蝎和哥斯拉,以phpshell连接为例,本文主要是对这四款经典的webshell管理工具进行流量分析和检测。 什么是一句话木马? 1、定义 顾名思义就是执行恶意指令的木马,通过技术手段上传到指定服务器并可以正常访问,将我们需要服务器执行的命令上传并执行 2、特点
WebShell流量特征检测_中国菜刀篇 WebShell流量特征检测_中国菜刀篇 WebShell流量特征检测_中国菜刀篇