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工具的开发。通过组合不同的选项和动作,可以构建出功能丰富的交互式命令行应用。

回到顶部