1.2 单词格式转换

在日常的生活和工作中,我们经常拿到一些单词的命名字符串,需要将它转换为各种各样格式的命名,像是在程序中,你原本已经定义了某个命名,但你可能会需要将其转为一个或多个 const 常量,这时候如果你人工一个个的修改,那就太繁琐了,并且还有可能改错,如此来往多次,那这工作效率实在是太低了。

实际上我们可以通过编写一个小工具来实现这个功能,一来能够满足自己的需求,二来也能不断迭代,甚至满足一些定制化需求,因此我们将在本章节中开始打造属于自己的工具链,首先我们将把工具的项目架子给搭建起来,然后开始实现一个工具,也就是支持多种单词格式转换的功能。

1.2.1 安装

首先需要安装本项目所依赖的基础库 Cobra,便于我们后续快速搭建 CLI 应用程序,在项目根目录执行命令如下:

  1. $ go get -u github.com/spf13/cobra@v1.0.0

1.2.2 初始化 cmd 和 word 子命令

接下来需要进行项目目录的初始化,目录结构如下:

  1. tour
  2. ├── main.go
  3. ├── go.mod
  4. ├── go.sum
  5. ├── cmd
  6. ├── internal
  7. └── pkg

在本项目中,我们创建了入口文件 main.go,并新增了三个目录,分别是 cmd、internal 以及 pkg,并在 cmd 目录下新建 word.go 文件,用于单词格式转换的子命令 word 的设置,写入如下代码:

  1. var wordCmd = &cobra.Command{
  2. Use: "word",
  3. Short: "单词格式转换",
  4. Long: "支持多种单词格式转换",
  5. Run: func(cmd *cobra.Command, args []string) {},
  6. }
  7. func init() {}

接下来还是在 cmd 目录下,增加 root.go 文件,作为根命令,写入如下代码:

  1. var rootCmd = &cobra.Command{}
  2. func Execute() error {
  3. return rootCmd.Execute()
  4. }
  5. func init() {
  6. rootCmd.AddCommand(wordCmd)
  7. }

最后在启动 main.go 文件中,写入如下运行代码:

  1. func main() {
  2. err := cmd.Execute()
  3. if err != nil {
  4. log.Fatalf("cmd.Execute err: %v", err)
  5. }
  6. }

1.2.3 单词转换

在功能上我们需要针对所计划兼容的单词转换类型进行具体的编码,分为四种类型支持:

  • 单词全部转为小写。
  • 单词全部转为大写。
  • 下划线单词转为大写驼峰。
  • 下划线单词转为小写驼峰。
  • 驼峰转为小写驼峰。

我们将在项目的 internal 目录下,新建 word 目录及文件,并在 word.go 写入后面的章节代码,完成对上述的四种单词类型转换的功能支持,目录结构如下:

  1. ├── internal
  2. └── word
  3. └── word.go

1.2.3.1 全部转为小写/大写

第一部分是针对任何单词进行大小写的转换,这一块比较简单,直接就是分别调用标准库 strings 中的 ToUpper 和 ToLower 方法直接进行转换,其原生方法的作用就是转为大写和小写,写入代码如下:

  1. func ToUpper(s string) string {
  2. return strings.ToUpper(s)
  3. }
  4. func ToLower(s string) string {
  5. return strings.ToLower(s)
  6. }

1.2.3.2 下划线转大写驼峰

第二部分是针对下划线命名方式的单词进行大写驼峰的转换,主体逻辑是将下划线替换为空格字符,然后将其所有字符修改为其对应的首字母大写的格式,最后将先前的空格字符替换为空,就可以确保各个部分所返回的首字母是大写并且是完整的一个字符串了,写入代码如下:

  1. func UnderscoreToUpperCamelCase(s string) string {
  2. s = strings.Replace(s, "_", " ", -1)
  3. s = strings.Title(s)
  4. return strings.Replace(s, " ", "", -1)
  5. }

1.2.3.3 下线线转小写驼峰

第三部分是针对下划线命名方式的单词进行小写驼峰的转换,主体逻辑可以直接复用大写驼峰的转换方法,然后只需要对其首字母进行处理就好了,在该方法中我们直接将字符串的第一位取出来,然后利用 unicode.ToLower 转换就可以了,写入代码如下:

  1. func UnderscoreToLowerCamelCase(s string) string {
  2. s = UnderscoreToUpperCamelCase(s)
  3. return string(unicode.ToLower(rune(s[0]))) + s[1:]
  4. }

1.2.3.4 驼峰转下划线

第四部分是针对大写或小写驼峰的单词进行下划线转换,也就是与第二和第三点相反的转换操作,这里我们直接使用 govalidator 库所提供的转换方法,主体逻辑为将字符串转换为小写的同时添加下划线,比较特殊的一点在于,当前字符若不为小写、下划线、数字,那么进行处理的同时将对 segment 置空,保证其每一段的区间转换是正确的,写入代码如下:

  1. func CamelCaseToUnderscore(s string) string {
  2. var output []rune
  3. for i, r := range s {
  4. if i == 0 {
  5. output = append(output, unicode.ToLower(r))
  6. continue
  7. }
  8. if unicode.IsUpper(r) {
  9. output = append(output, '_')
  10. }
  11. output = append(output, unicode.ToLower(r))
  12. }
  13. return string(output)
  14. }

1.2.4 word 子命令

在完成了单词的各个转换方法后,我们开始编写 word 子命令,将其对应的方法集成到我们的 Command 中,打开项目下的 cmd/word.go 文件,定义目前单词所支持的转换模式枚举值,新增代码如下:

  1. const (
  2. ModeUpper = iota + 1 // 全部转大写
  3. ModeLower // 全部转小写
  4. ModeUnderscoreToUpperCamelCase // 下划线转大写驼峰
  5. ModeUnderscoreToLowerCamelCase // 下线线转小写驼峰
  6. ModeCamelCaseToUnderscore // 驼峰转下划线
  7. )

接下来进行具体的单词子命令的设置和集成,继续新增如下代码:

  1. var desc = strings.Join([]string{
  2. "该子命令支持各种单词格式转换,模式如下:",
  3. "1:全部转大写",
  4. "2:全部转小写",
  5. "3:下划线转大写驼峰",
  6. "4:下划线转小写驼峰",
  7. "5:驼峰转下划线",
  8. }, "\n")
  9. var wordCmd = &cobra.Command{
  10. Use: "word",
  11. Short: "单词格式转换",
  12. Long: desc,
  13. Run: func(cmd *cobra.Command, args []string) {
  14. var content string
  15. switch mode {
  16. case ModeUpper:
  17. content = word.ToUpper(str)
  18. case ModeLower:
  19. content = word.ToLower(str)
  20. case ModeUnderscoreToUpperCamelCase:
  21. content = word.UnderscoreToUpperCamelCase(str)
  22. case ModeUnderscoreToLowerCamelCase:
  23. content = word.UnderscoreToLowerCamelCase(str)
  24. case ModeCamelCaseToUnderscore:
  25. content = word.CamelCaseToUnderscore(str)
  26. default:
  27. log.Fatalf("暂不支持该转换模式,请执行 help word 查看帮助文档")
  28. }
  29. log.Printf("输出结果: %s", content)
  30. },
  31. }

在上述代码中,核心在于子命令 word 的 cobra.Command 调用和设置,其一共包含如下四个常用选项,分别是:

  • Use:子命令的命令标识。
  • Short:简短说明,在 help 输出的帮助信息中展示。
  • Long:完整说明,在 help 输出的帮助信息中展示。

接下来我们根据单词转换所需的参数,分别是单词内容和转换的模式进行命令行参数的设置和初始化,继续写入如下代码:

  1. var str string
  2. var mode int8
  3. func init() {
  4. wordCmd.Flags().StringVarP(&str, "str", "s", "", "请输入单词内容")
  5. wordCmd.Flags().Int8VarP(&mode, "mode", "m", 0, "请输入单词转换的模式")
  6. }

在 VarP 系列的方法中,第一个参数为需绑定的变量、第二个参数为接收该参数的完整的命令标志,第三个参数为对应的短标识,第四个参数为默认值,第五个参数为使用说明。

1.2.5 验证

在完成了单词格式转换的功能后,已经初步的拥有了一个工具了,现在我们来验证一下功能是否正常,一般我们拿到一个 CLI 应用程序,我们会先执行 help 来先查看其帮助信息,如下:

  1. $ go run main.go help word
  2. 该子命令支持各种单词格式转换,模式如下:
  3. 1:全部转大写
  4. 2:全部转小写
  5. 3:下划线转大写驼峰
  6. 4:下划线转小写驼峰
  7. 5:驼峰转下划线
  8. Usage:
  9. word [flags]
  10. Flags:
  11. -h, --help help for word
  12. -m, --mode int8 请输入单词转换的模式
  13. -s, --str string 请输入单词内容

手工验证四种单词的转换模式的功能点是否正常,如下:

  1. $ go run main.go word -s=eddycjy -m=1
  2. 输出结果: EDDYCJY
  3. $ go run main.go word -s=EDDYCJY -m=2
  4. 输出结果: eddycjy
  5. $ go run main.go word -s=eddycjy -m=3
  6. 输出结果: Eddycjy
  7. $ go run main.go word -s=EDDYCJY -m=4
  8. 输出结果: eDDYCJY
  9. $ go run main.go word -s=EddyCjy -m=5
  10. 输出结果: eddy_cjy

1.2.6 小结

作为第一个实战项目,我们基于第三方开源库 Cobra 和标准库 strings、unicode 实现了多种模式的单词转换,非常简单,也是在日常的工作中较实用的一环,因为我们经常会需要对输入、输出数据进行各类型的转换和拼装。

本图书由 煎鱼©2020 版权所有,所有文章采用知识署名-非商业性使用-禁止演绎 4.0 国际进行许可。

1.2 单词格式转换 - 图1