部分代码实现上做了调整,达到了自己想要的功能。
功能描述 支持5种单词格式转换, 模式如下: 1: 全部单词转大写 2: 全部单词转小写 3: 下划线转大写驼峰 4: 下划线转小写驼峰 5: 驼峰转下划线 举例: TimeForFun 使用模式1 转换为 TIMEFORFUN 使用模式2 转换为 timeforfun time_for_fun 使用模式3 转换为 TimeForFun 使用模式4 转换为 timeForFun TimeForFun 使用模式5 转换为 time_for_fun 目录结构及代码和简要说明 目录tour
cmd
root.go
word.go
internal
word
word.go
go.mod
main.go
代码及说明main.go
package main import ( "log" "tour/cmd" ) func main() { err := cmd.Execute() if err != nil { log.Fatalf("cmd.Execute err: %v", err) } }go.mod
module tour go 1.14 require ( github.com/spf13/cobra v1.0.0 )cmd - root.go
添加 wordcmd, 也就是cmd - word.go 中声明的wordCmd
package cmd import ( "github.com/spf13/cobra" ) var rootCmd = &cobra.Command{} func Execute() error { return rootCmd.Execute() } func init() { rootCmd.AddCommand(wordCmd) }cmd - word.go
使用iota自增来进行符号赋值,编写word子命令,使用switch进行模式选择,然后执行对应方法
package cmd import ( "github.com/spf13/cobra" "log" "strings" "tour/internal/word" ) const ( ModeUpper = iota + 1 //全部单词转大写 ModeLower //全部单词转小写 ModeUnderscoreToUpperCamelCase //下划线转大写驼峰 ModeUnderscoreToLowerCamelCase //下划线转小写驼峰 ModeCamelCaseToUnderscore //驼峰转下划线 ) var str string var mode int8 var desc = strings.Join([]string{ "该子命令支持各种单词格式转换, 模式如下:", "1: 全部单词转大写", "2: 全部单词转小写", "3: 下划线转大写驼峰", "4: 下划线转小写驼峰", "5: 驼峰转下划线", }, "\r\n") 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 ModeUnderscoreToUpperCamelCase: content = word.UderscoreToUpperCamelCase(str) case ModeUnderscoreToLowerCamelCase: content = word.UderscoreToLowerCamelCase(str) case ModeCamelCaseToUnderscore: content = word.CamelCaseToUdnderscore(str) default: log.Fatalf("暂不支持该格式转换,请执行help word查看帮助文档") } log.Printf("转换结果: %s", content) }, } func init() { wordCmd.Flags().StringVarP(&str, "str", "s", "", "请输入单词") wordCmd.Flags().Int8VarP(&mode, "mode", "m", 0, "请输入转换模式") }internal - word - word.go
全部转化为大写
使用strings.ToUpper方法
全部转化为小写
使用strings.ToLower方法
下划线单词转为大写驼峰单词
把 '_' 替换为空,然后字符串调用strings.Title方法
下划线单词转为小写驼峰单词
调用上面的方法那字符串转为大写驼峰,然后再调用unicode.ToLower转为小写驼峰,再用string方法转为字符串
驼峰单词转下划线单词
遍历字符串,先把第一个字符转为小写,然后遇到大写字母就在前面加个 '_' 然后再把大写字母转为小写,直至遍历完成。
package word import ( "strings" "unicode" ) //单词全部转化为大写 func ToUpper(s string) string { return strings.ToUpper(s) } //单词全部转化为小写 func ToLower(s string) string { return strings.ToLower(s) } //下划线单词转为大写驼峰单词 func UderscoreToUpperCamelCase(s string) string { s = strings.Replace(s, "_", " ", -1) s = strings.Title(s) return strings.Replace(s, " ", "", -1) } //下划线单词转为小写驼峰单词 func UderscoreToLowerCamelCase(s string) string { s = UderscoreToUpperCamelCase(s) return string(unicode.ToLower(rune(s[0]))) + s[1:] return s } //驼峰单词转下划线单词 func CamelCaseToUdnderscore(s string) string { var output []rune for i, r := range s { if i == 0 { output = append(output, unicode.ToLower(r)) } else { if unicode.IsUpper(r) { output = append(output, '_') } output = append(output, unicode.ToLower(r)) } } return string(output) } 执行效果如下