Go之Cobra实现单词转换工具

参考书籍《Go语言编程之旅》

Cobra特性

支持子命令行(Subcommand)模式
完全兼容posix命令行模式 支持全局、局部、串联的命令行参数flag
支持全局、局部、串联的命令行参数flag
轻松生成应用程序和命令
如果命令输入错误提供智能建议
自动生成命令和参数的帮助信息
自动生成详细的命令行帮助
自动识别-h help flag
提供bash环境下的自动补全功能
支持命令行别名
自定义帮助和实用信息
可与viper配置紧密结合
自动生成应用程序的帮助手册

一个简单的例子

package main

import (
	"fmt"
	"github.com/spf13/cobra"
)

func main() {
	//创建rootCmd主命令,并定义run执行函数(注意,此处是定义run函数而并非直接执行该函数,也可以通过rootcmd.ADDCommand方法添加子命令)
	//为命令添加命令行参数flag
	//执行rootCmd命令调用的函数,rootCmd.Execute会在内部回调run执行函数
	var Version bool
	var rootCmd = &cobra.Command{
		Use: "root [sub]",
		Short: "root command",
		Run: func(cmd *cobra.Command, args []string) {
			fmt.Printf("args : %v \n",args)
			if Version {
				fmt.Printf("version 1.0\n")
			}
		},
	}
	flags := rootCmd.Flags()
	flags.BoolVarP(&Version,"version","v",false,"print version and quit")
	_ = rootCmd.Execute()
}

在这里插入图片描述

那我们用cobra来实现一个简单的小工具
工具的功能介绍
单词转换,我们对单词转换类型
单词全部转为大写
单词全部转为小写
下划线单词转为大写驼峰单词下划线单词转为小写驼峰单词
驼峰单词转为下划线单词

目录结构
在这里插入图片描述

//main.go
package main

import (
	"test/cmd"
	"log"
)

func main() {
	err := cmd.Execute()
	if err != nil {
		log.Fatalf("cmd.Execute err: %v", err)
	}
}
//   /cmd/root.go
package cmd

import "github.com/spf13/cobra"

var rootCmd = &cobra.Command{
	Use: "",
	Short: "",
	Long: "",
}

func Execute() error{
	return rootCmd.Execute()
}

func init() {
	rootCmd.AddCommand(wordCmd)
}
// /cmd/word.go
package cmd

import (
	"github.com/spf13/cobra"
	"log"
	"strings"
	"test/internal/word"
)

var (
	str string
	mode int8
)
//这里
//use 子命令的命令标识
//short 简短说明 在help中命令输出的帮助信息中展示
//long 完整说明 在help中命令输出的帮助信息中展示
var wordCmd = &cobra.Command{
	Use: "word",
	Short: "单词格式转换",
	Long: desc,
	Run: func(cmd *cobra.Command, args []string) {
		var content string
		switch mode {
		case ModeUpper:
			content = word.ToUpper(str)
		case ModeLower:
			content = word.ToLower(str)
		case ModeUnderscodeToUpperCamlcase:
			content = word.UndersoreToUpperCamelCase(str)
		case ModeUnderscodeToLowerCamlcase:
			content = word.UnderScoreToLowerCamelCase(str)
		case ModeCamelcaseToUndescore:
			content = word.CamelCaseToUnderscore(str)
		default:
			log.Fatalf("暂时不支持,请htlp word查看")
		}
		log.Printf("输出结果:%s\n",content)
	},
}

func init() {
	//varp 系列的方法 第一个参数是需要绑定的变量,第二个参数是接受该参数的完整的命令标志,第三个参数是对应的短标识,第四个参数为默认值,第五个参数为使用说明
	wordCmd.Flags().StringVarP(&str,"str","s","","请输入单词内容")
	wordCmd.Flags().Int8VarP(&mode,"mode","m",0,"请输入单词转义的模式")
}

const (
	ModeUpper = iota + 1  //全部转为大写
	ModeLower			  //全部转为小写
	ModeUnderscodeToUpperCamlcase     //下划线单词转为大写驼峰单词
	ModeUnderscodeToLowerCamlcase     //下划线单词转为小写驼峰单词
	ModeCamelcaseToUndescore          //驼峰转为下划线单词
)

var desc = strings.Join([]string{
	"该子命令支持各种单词格式转换,模式如下",
	"1:全部转为大写",
	"2:全部转为小写",
	"3:下划线转为大写驼峰",
	"4:下划线转为小谢驼峰",
	"5:驼峰转为下划线",
	},"\n")
// /internal/word.go
package word

import (
	"strings"
	"unicode"
)

func ToUpper(s string)string {
	return  strings.ToUpper(s)
}

func ToLower(s string)string {
	return strings.ToLower(s)
}

//下划线单词转为大写驼峰单词
func UndersoreToUpperCamelCase(s string) string{
	s = strings.Replace(s,"_","",-1)
	s = strings.Title(s)
	return strings.Replace(s," ","",-1)
}

//下划线单词转小写驼峰单词
func UnderScoreToLowerCamelCase(s string) string {
	s = UndersoreToUpperCamelCase(s)
	return string(unicode.ToLower(rune(s[0]))) + s[1:]
}

//驼峰单词转下划线单词
func CamelCaseToUnderscore(s string) string {
	var output []rune
	for i ,r := range  s {
		if i == 0 {
			output = append(output,unicode.ToLower(r))
			continue
		}
		//这个用来判断是否是大写字母是的话 就加一个_ 然后在加字母
		if unicode.IsUpper(r) {
			output = append(output,'_')
		}
		output = append(output,unicode.ToLower(r))
	}
	return  string(output)
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45413603/article/details/107503560
今日推荐