在Golang中如何设置向导程序

在Golang中如何设置向导程序 你好,我想设置一个类似向导的功能。我会打印一个数组的所有值,然后询问用户希望为工具保留哪些值在作用域内,之后工具再继续运行。这可以理解为一种由用户进行的过滤操作。

我该如何实现?

假设它返回一个像 [{123} {456} {789} {000}] 这样的数组,而用户只想保留第一个和第三个元素。一旦用户选择了这两个数字,工具就可以继续运行。

请告诉我,谢谢。

3 回复

你是在讨论过滤操作吗?你可以在这里找到一个示例,了解应该如何实现——SliceTricks

更多关于在Golang中如何设置向导程序的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,我指的是像这样:

do you want to keep this value? (yes/no)

如果他输入“no”,该值将被删除;否则,程序将继续执行。感谢分享,这对我很有帮助!👍

在Golang中实现向导程序可以通过标准库的fmtbufio包来处理用户交互。以下是一个示例实现:

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	// 初始数组
	items := []string{"123", "456", "789", "000"}
	
	// 打印所有选项
	fmt.Println("可用选项:")
	for i, item := range items {
		fmt.Printf("%d: %s\n", i+1, item)
	}
	
	// 获取用户选择
	selected := getUserSelection(items)
	
	// 过滤数组
	filteredItems := filterItems(items, selected)
	
	fmt.Printf("您选择的项目: %v\n", filteredItems)
	
	// 继续执行工具的其他逻辑
	// yourToolContinue(filteredItems)
}

func getUserSelection(items []string) []int {
	reader := bufio.NewReader(os.Stdin)
	var selected []int
	
	fmt.Println("\n请输入要保留的项目编号(用逗号分隔,如:1,3):")
	
	for {
		input, _ := reader.ReadString('\n')
		input = strings.TrimSpace(input)
		
		if input == "" {
			fmt.Println("输入不能为空,请重新输入:")
			continue
		}
		
		// 解析输入
		selected = parseSelection(input, len(items))
		if selected != nil {
			break
		}
		
		fmt.Println("输入无效,请重新输入(如:1,3):")
	}
	
	return selected
}

func parseSelection(input string, maxItems int) []int {
	parts := strings.Split(input, ",")
	var selected []int
	
	for _, part := range parts {
		part = strings.TrimSpace(part)
		if part == "" {
			continue
		}
		
		num, err := strconv.Atoi(part)
		if err != nil || num < 1 || num > maxItems {
			return nil
		}
		
		// 检查重复
		duplicate := false
		for _, s := range selected {
			if s == num-1 { // 转换为0-based索引
				duplicate = true
				break
			}
		}
		
		if !duplicate {
			selected = append(selected, num-1)
		}
	}
	
	if len(selected) == 0 {
		return nil
	}
	
	return selected
}

func filterItems(items []string, indices []int) []string {
	var filtered []string
	for _, idx := range indices {
		if idx >= 0 && idx < len(items) {
			filtered = append(filtered, items[idx])
		}
	}
	return filtered
}

这个实现包含以下功能:

  1. 显示所有选项并编号
  2. 接受用户输入(支持逗号分隔的选择)
  3. 验证输入有效性
  4. 过滤数组并返回结果

运行示例:

可用选项:
1: 123
2: 456
3: 789
4: 000

请输入要保留的项目编号(用逗号分隔,如:1,3):
1,3
您选择的项目: [123 789]

如果需要更复杂的交互,可以考虑使用第三方库如survey

import "github.com/AlecAivazis/survey/v2"

func useSurvey() {
	items := []string{"123", "456", "789", "000"}
	var selected []string
	
	prompt := &survey.MultiSelect{
		Message: "选择要保留的项目:",
		Options: items,
	}
	
	survey.AskOne(prompt, &selected)
	fmt.Printf("选择的项目: %v\n", selected)
}
回到顶部