参考书籍《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)
}