声明
代码引自书籍 《Go语言编程之旅:一起用Go做项目》 作者:陈剑煜 徐新华
部分代码实现上做了调整,达到了自己想要的功能。
功能描述
支持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
- word
- go.mod
- main.go
- cmd
代码及说明
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)
}