golang命令行交互式菜单选择插件库wmenu的使用
Golang命令行交互式菜单选择插件库wmenu的使用
介绍
wmenu是一个为CLI程序创建菜单的Go语言包。它使用wlog作为与命令行的接口,默认并发使用os.Stdin、os.Stdout和os.Stderr。wmenu允许你改变菜单不同部分的颜色,并创建自己的错误结构以便进行类型断言。
导入
Go 1.11及以上版本
import "github.com/dixonwille/wmenu/v5"
功能特性
- 强制单选
- 允许多选
- 更改分隔符
- 更改菜单不同部分的颜色
- 轻松查看哪些选项是默认选项
- 更改默认选项使用的符号
- 询问简单的"是"和"否"问题
- 在调用任何函数前验证所有响应
- 支持多种"是/否"回答格式
- 自动确定应调用哪个函数(选项函数、默认函数或多选函数)
- 如果响应无效,可重新提问最多指定次数
- 可更改读写器
- 菜单显示时清除屏幕
基本使用示例
这是一个简单的使用示例:
menu := wmenu.NewMenu("What is your favorite food?")
menu.Action(func (opts []wmenu.Opt) error {
fmt.Printf(opts[0].Text + " is your favorite food.")
return nil
})
menu.Option("Pizza", nil, true, nil)
menu.Option("Ice Cream", nil, false, nil)
menu.Option("Tacos", nil, false, func(opt wmenu.Opt) error {
fmt.Printf("Tacos are great")
return nil
})
err := menu.Run()
if err != nil{
log.Fatal(err)
}
输出如下:
1) *Pizza
2) Ice Cream
3) Tacos
What is your favorite food?
多选功能
你可以启用多选功能:
menu.AllowMultiple()
默认分隔符是空格,但可以更改:
menu.SetSeperator("some string")
是/否问题
wmenu还可以用来询问简单的"是/否"问题:
menu.IsYesNo(0)
高级用法示例
以下示例展示了如何传递自定义类型并在函数中使用:
type NameEntity struct {
FirstName string
LastName string
}
optFunc := func(opt wmenu.Opt) error {
fmt.Println("Option 1 was chosen.")
return nil
}
actFunc := func(opt wmenu.Opt) error {
name, ok := opt.Value.(NameEntity)
if !ok {
log.Fatal("Could not cast option's value to NameEntity")
}
fmt.Printf("%s has an id of %d.\n", opt.Text, opt.ID)
fmt.Printf("Hello, %s %s.\n", name.FirstName, name.LastName)
return nil
}
menu := NewMenu("Choose an option.")
menu.ChangeReaderWriter(reader, os.Stdout, os.Stderr)
menu.Action(actFunc)
menu.Option("Option 1", NameEntity{"Bill", "Bob"}, true, optFunc)
menu.Option("Option 2", NameEntity{"John", "Doe"}, false, nil)
menu.Option("Option 3", NameEntity{"Jane", "Doe"}, false, nil)
err := menu.Run()
if err != nil {
log.Fatal(err)
}
版本说明
- V1.0.0 - 主要发布
- V2.0.0 - 允许传递接口作为选项
- V3.0.0 - 将选项传递给该选项的函数
- V4.0.0 - 新增支持多选的Action
- v5.0.0 - 支持Go Modules
完整示例
package main
import (
"fmt"
"log"
"github.com/dixonwille/wmenu/v5"
)
func main() {
// 创建新菜单
menu := wmenu.NewMenu("请选择一个操作:")
// 定义菜单选项
menu.Action(func(opts []wmenu.Opt) error {
if len(opts) == 0 {
fmt.Println("没有选择任何选项")
return nil
}
for _, opt := range opts {
fmt.Printf("你选择了: %s\n", opt.Text)
}
return nil
})
// 添加菜单选项
menu.Option("查看状态", nil, false, func(opt wmenu.Opt) error {
fmt.Println("系统状态正常")
return nil
})
menu.Option("备份数据", nil, false, nil)
menu.Option("恢复数据", nil, false, nil)
menu.Option("退出", nil, false, func(opt wmenu.Opt) error {
fmt.Println("再见!")
return nil
})
// 允许多选
menu.AllowMultiple()
// 运行菜单
err := menu.Run()
if err != nil {
log.Fatal(err)
}
}
这个示例展示了如何创建一个允许多选的交互式菜单,并为某些选项添加特定的处理函数。
更多关于golang命令行交互式菜单选择插件库wmenu的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang命令行交互式菜单选择插件库wmenu的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用wmenu创建Golang命令行交互式菜单
wmenu是一个简单易用的Golang库,用于在命令行中创建交互式菜单。它支持单选、多选等功能,并且可以自定义菜单项的样式。
安装wmenu
go get github.com/dixonwille/wmenu/v5
基本使用示例
package main
import (
"fmt"
"os"
"github.com/dixonwille/wmenu/v5"
)
func main() {
menu := wmenu.NewMenu("请选择一个选项:")
// 添加菜单选项
menu.Option("选项 1", nil, false, nil)
menu.Option("选项 2", nil, false, nil)
menu.Option("选项 3", nil, false, nil)
menu.Option("退出", nil, false, func(opt wmenu.Opt) error {
os.Exit(0)
return nil
})
// 设置菜单动作处理函数
menu.Action(func(opts []wmenu.Opt) error {
opt := opts[0] // 获取用户选择的第一个选项
fmt.Printf("您选择了: %s\n", opt.Text)
return nil
})
// 运行菜单
err := menu.Run()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
高级功能示例
1. 多选菜单
func multiSelectExample() {
menu := wmenu.NewMenu("请选择多个选项(用逗号分隔):")
menu.IsYesNo(false)
menu.MultiSelect(true) // 启用多选
menu.Option("苹果", "apple", false, nil)
menu.Option("香蕉", "banana", false, nil)
menu.Option("橙子", "orange", false, nil)
menu.Option("葡萄", "grape", false, nil)
menu.Action(func(opts []wmenu.Opt) error {
fmt.Println("您选择了:")
for _, opt := range opts {
fmt.Printf("- %s (值: %v)\n", opt.Text, opt.Value)
}
return nil
})
_ = menu.Run()
}
2. 带默认值的菜单
func defaultOptionExample() {
menu := wmenu.NewMenu("请选择一个颜色(默认红色):")
// 第三个参数true表示这是默认选项
menu.Option("红色", "red", true, nil)
menu.Option("蓝色", "blue", false, nil)
menu.Option("绿色", "green", false, nil)
menu.Action(func(opts []wmenu.Opt) error {
opt := opts[0]
fmt.Printf("您选择的颜色是: %s (值: %v)\n", opt.Text, opt.Value)
return nil
})
_ = menu.Run()
}
3. 自定义菜单样式
func customStyleExample() {
menu := wmenu.NewMenu("自定义样式菜单:")
// 自定义颜色
menu.SetSeparator(" > ")
menu.Color(wmenu.BrightBlue, wmenu.Red, wmenu.BrightYellow, wmenu.Green, wmenu.BrightGreen)
menu.Option("第一项", 1, false, nil)
menu.Option("第二项", 2, false, nil)
menu.Option("第三项", 3, false, nil)
menu.Action(func(opts []wmenu.Opt) error {
fmt.Printf("选择的值: %v\n", opts[0].Value)
return nil
})
_ = menu.Run()
}
错误处理
wmenu会返回可能出现的错误,应该妥善处理:
func errorHandlingExample() {
menu := wmenu.NewMenu("带有错误处理的菜单:")
menu.Option("继续", nil, false, nil)
menu.Option("退出", nil, false, func(opt wmenu.Opt) error {
return fmt.Errorf("用户选择退出")
})
menu.Action(func(opts []wmenu.Opt) error {
fmt.Println("继续执行...")
return nil
})
err := menu.Run()
if err != nil {
fmt.Printf("发生错误: %v\n", err)
os.Exit(1)
}
}
实际应用示例
func mainMenu() {
for {
menu := wmenu.NewMenu("主菜单:")
menu.Option("用户管理", nil, false, func(opt wmenu.Opt) error {
userManagementMenu()
return nil
})
menu.Option("系统设置", nil, false, func(opt wmenu.Opt) error {
systemSettingsMenu()
return nil
})
menu.Option("退出系统", nil, false, func(opt wmenu.Opt) error {
os.Exit(0)
return nil
})
menu.Action(func(opts []wmenu.Opt) error {
// 主菜单的动作由子菜单处理
return nil
})
if err := menu.Run(); err != nil {
fmt.Println("菜单错误:", err)
}
}
}
func userManagementMenu() {
// 用户管理子菜单实现
}
func systemSettingsMenu() {
// 系统设置子菜单实现
}
wmenu库提供了简单直观的API来创建命令行菜单,适合各种CLI工具的开发。通过组合不同的选项和动作,可以构建出功能丰富的交互式命令行应用。