如何简化Golang中多层if-else实现的菜单逻辑代码
Go语言菜单打印功能代码优化方案
核心优化思路
- 替换冗长的if-else判断链,将选项编号和对应的处理函数绑定,后续新增选项无需修改判断逻辑
- 统一封装选中提示的打印逻辑,不需要每个分支重复编写打印代码
- 输入合法性校验和业务逻辑解耦,代码可读性和可维护性更高
具体实现方案
方案1:函数切片绑定处理逻辑(最适合1~N连续编号的选项)
你的选项是1~10的连续整数,直接用切片索引对应选项编号是最高效的实现方式,后续加选项只需要新增处理函数、在切片里加对应映射即可:
package main import "fmt" // 定义每个选项对应的业务处理函数 func handleOption1() { // 此处写选项1的业务逻辑 } func handleOption2() { // 此处写选项2的业务逻辑 } // 省略3~9的处理函数定义,写法和上面一致 func handleOption10() { // 此处写选项10的业务逻辑 } func main() { // 切片索引对应选项编号,索引0留空占位 optionHandlers := []func(){ 0: nil, 1: handleOption1, 2: handleOption2, 3: nil, 4: nil, 5: nil, 6: nil, 7: nil, 8: nil, 9: nil, 10: handleOption10, } const minOption = 1 const maxOption = 10 fmt.Println("Hello welcome") var input int fmt.Println("Please choose an option:") _, err := fmt.Scanln(&input) if err != nil { fmt.Println("输入格式非法") return } // 统一校验+打印选中提示,再执行对应业务逻辑 if input >= minOption && input <= maxOption { fmt.Printf("You have chosen option %d\n", input) optionHandlers[input]() } else { fmt.Print("Not an option") } }
方案2:switch分支实现(适合选项少、后续扩展需求低的场景)
如果你的选项后续不会频繁新增,用switch替换if-else也可以大幅提升代码可读性:
func main() { fmt.Println("Hello welcome") var input int fmt.Println("Please choose an option:") fmt.Scanln(&input) switch input { case 1: fmt.Println("Option 1 chosen") handleOption1() case 2: fmt.Println("Option 2 chosen") handleOption2() // 省略3~9的分支,写法和上面一致 case 10: fmt.Println("Option 10 chosen") handleOption10() default: fmt.Print("Not an option") } }
内容的提问来源于stack exchange,提问作者chizuzi
相关产品推荐
相关产品推荐

