首页 > 其他分享 >Go语言单词格式转换命令行工具

Go语言单词格式转换命令行工具

时间:2022-11-17 19:47:47浏览次数:77  
标签:word string cmd 命令行 单词 go str Go

学习:单词格式转换 | Go 语言编程之旅 (eddycjy.com)

代码参考:go-programming-tour-book/tour: 《Go 语言编程之旅:一起用 Go 做项目》第一章:命令行程序(Command) (github.com)

使用工具cobra:

go get -u github.com/spf13/[email protected]

先搭好架子,再具体实现!

接口的应用中也有这种思想,接口相当于先制定标准再具体实现;

搭好架子/制定标准:全局架构清晰;具体实现。

搭好架子

$ tree
.
├── cmd
│   ├── root.go
│   └── word.go
├── main.go

cmd/word.go,用于单词格式转换的子命令 word 的简单设置

var wordCmd = &cobra.Command{
	Use:   "word",   								// 子命令的命令标识。
	Short: "单词格式转换", 						// 简短说明,在 help 输出的帮助信息中展示。
	Long:  "支持多种单词格式转换",     // 完整说明,在 help 输出的帮助信息中展示。
	Run: func(cmd *cobra.Command, args []string) {}, // 具体实现Todo;
}

func init() {}

cmd/root.go,用于创建根命令,将子命令加入根命令中

var rootCmd = &cobra.Command{} // 新建的空Command

func Execute() error {
	return rootCmd.Execute() // 执行设置的命令;
}

func init() { // init在main函数之间执行;在import此包的变量,常量后,立即执行;
	rootCmd.AddCommand((wordCmd)) // 将创建的子命令加入rootCmd
}
  • 关于init函数:

main包中导入cmd并使用cmd包:

import (
	"log"
	"github.com/KpiHang/tour/cmd"
)

var name string

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

详细设置word子命令

此步骤还不包括,功能具体的功能实现;

cmd/word.go:

package cmd

import (
	"log"
	"strings"

	"github.com/KpiHang/tour/internal/word"
	"github.com/spf13/cobra"
)

// 用于单词格式转换的子命令 word 的设置

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

var str string
var mode int8 // 选择转换模式mode

// Long desc: the long message shown in the 'help <this-command>' output.
var desc = strings.Join([]string{
	"该子命令支持各种单词格式转换,模式如下:",
	"1:全部转大写",
	"2:全部转小写",
	"3:下划线转大写驼峰",
	"4:下划线转小写驼峰",
	"5:驼峰转下划线",
}, "\n")

var wordCmd = &cobra.Command{
	Use:   "word",   // 子命令的命令标识。
	Short: "单词格式转换", // 简短说明,在 help 输出的帮助信息中展示。
	Long:  desc,     // 完整说明,在 help 输出的帮助信息中展示。
	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.UnderscoreToUpperCamelCase(str)
		case ModeUnderscoreToLowerCamelCase:
			content = word.UnderscoreToLowerCamelCase(str)
		case ModeCamelCaseToUnderscore:
			content = word.CamelCaseToUnderscore(str)
		default:
			log.Fatalf("暂不支持该转换模式,请执行 help word 查看帮助文档")
		}

		log.Printf("输出结果: %s", content)
	},
}

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

  • 因为,word子命令需要两个参数:

    1. -m, --mode int8 请输入单词转换的模式
    2. -s, --str string 请输入单词内容
  • 所以,要把这两个参数,绑定到两个变量,来使用:

    	wordCmd.Flags().StringVarP(&str, "str", "s", "", "请输入单词内容") // shorthand: 短标识;
    	wordCmd.Flags().Int8VarP(&mode, "mode", "m", 0, "请输入单词转换的模式")
    
    • 第一个参数为需绑定的变量
    • 第二个参数为接收该参数的完整的命令标志
    • 第三个参数为对应的短标识
    • 第四个参数为默认值
    • 第五个参数为使用说明
  • 设置功能:

    const (
    	ModeUpper                      = iota + 1 // 全部转大写;1
    	ModeLower                                 // 全部转小写;2
    	ModeUnderscoreToUpperCamelCase            // 下划线转大写驼峰;3
    	ModeUnderscoreToLowerCamelCase            // 下线线转小写驼峰;4
    	ModeCamelCaseToUnderscore                 // 驼峰转下划线;5
    )
    
    
    		var content string
    		switch mode {
    		case ModeUpper:
    			content = word.ToUpper(str)
    		case ModeLower:
    			content = word.ToLower(str)
    		case ModeUnderscoreToUpperCamelCase:
    			content = word.UnderscoreToUpperCamelCase(str)
    		case ModeUnderscoreToLowerCamelCase:
    			content = word.UnderscoreToLowerCamelCase(str)
    		case ModeCamelCaseToUnderscore:
    			content = word.CamelCaseToUnderscore(str)
    		default:
    			log.Fatalf("暂不支持该转换模式,请执行 help word 查看帮助文档")
    		}
    

功能具体实现

新增加internal目录:

$ tree
.
├── cmd
│   ├── root.go
│   └── word.go
├── internal
│   └── word
│       └── word.go
├── main.go

internal包,Go中命名为internal的package或者目录,两点需要注意:

  1. 只有直接父级package,以及父级package的子孙package可以访问,其他的都不行,再往上的祖先package也不行。
  2. 父级package也只能访问internal package使用大写暴露出的内容,小写的不行。

在项目中不被复用,也不能被其他项目导入,仅被本项目内部使用的代码包即私有的代码包都应该放在internal文件夹下。该文件夹下的所有包及相应文件都有一个项目保护级别,即其他项目是不能导入这些包的,仅仅是该项目内部使用。

internal/word/word.go,功能的具体实现:

package word

import (
	"strings"
	"unicode"

	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)

// 单词全部转为小写。
func ToLower(s string) string {
	return strings.ToLower(s)
}

// 单词全部转为大写。
func ToUpper(s string) string {
	return strings.ToUpper(s)
}

// 下划线单词转为大写驼峰。
func UnderscoreToUpperCamelCase(s string) string {
	s = strings.Replace(s, "_", " ", -1)    // 将下划线替换为空格字符
	s = cases.Title(language.Und).String(s) // 将其所有字符修改为其对应的首字母大写的格式 strings.Title go1.18中被遗弃;
	return strings.Replace(s, " ", "", -1)  // 最后将先前的空格字符替换为空
}

// 下划线单词转为小写驼峰。
func UnderscoreToLowerCamelCase(s string) string {
	s = UnderscoreToUpperCamelCase(s)                  // 主体逻辑可以直接复用大写驼峰的转换方法
	return string(unicode.ToLower(rune(s[0]))) + s[1:] // 然后只需要对其首字母进行处理就好了
}

// 驼峰转下划线 eg AppStore --> app_store
func CamelCaseToUnderscore(s string) string {
	var output []rune // rune代表一个utf-8字符
	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)
}
  • 注意Go 1.18以后,strings.Title()方法被遗弃了,用cases包代替:

    	s = cases.Title(language.Und).String(s) // 将其所有字符修改为其对应的首字母大写的格式 
    

标签:word,string,cmd,命令行,单词,go,str,Go
From: https://www.cnblogs.com/kphang/p/16900551.html

相关文章

  • Django-配置docker、git环境与项目创建
    Django-配置docker、git环境与项目创建django官方社区django官方文档acwingDjango课学习笔记Django项目笔记前提租好了云服务器,并配置好了免密登录我的云服务器免密......
  • Linux 环境下使用 docker 安装 MongoDB
    在学习尚医通的项目过程中P66的学习内容,其中内容不完全和老师相同。1.拉取镜像dockerpullmongo:latest2.创建和启动容器在dockerrun中加入–privileged=true给......
  • go语言string函数的使用
    packagemainimport("fmt""strconv""strings")funcmain(){//1str:="hello杯"//goland统一为utf-8(字母数字占一个字节,汉字占3个字节)fmt.Println(le......
  • Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!
    大家好,我是煎鱼。Go语言中有一个东西是比较有特色的,那就是time标准库,在各类与时间有关的场景都会常常用到,例如:定时/延迟任务、数据更新、时间比较。官方Demo是一个......
  • 792. 匹配子序列的单词数
    792.匹配子序列的单词数给定字符串s 和字符串数组 words,返回  words[i] 中是s的子序列的单词个数 。字符串的子序列是从原始字符串中生成的新字符串,可以从中......
  • (转)Nginx:04---Nginx的命令行控制
    原文:https://blog.csdn.net/qq_41453285/article/details/106295274在默认的情况下:Nginx安装在/usr/local/nginx/下可执行的Nginx文件为/usr/local/nginx//sbin/nginx默认......
  • Django model 中的 class Meta 详解
    通过一个内嵌类"classMeta"给你的model定义元数据classCourseCategory(BaseModel):name=models.CharField(max_length=64,unique=True,verbose_name='分类名......
  • GO学习笔记之基本数据类型
    整型普通整型类型描述uint8无符号8位整型(0到255)uint16无符号16位整型(0到65535)uint32无符号32位整型(0到4294967295)uint64无符号......
  • Visual Studio 2017 编译 mongo-c-driver 库
    VisualStudio2017编译mongo-c-driver库运行环境:......
  • 12.django-外部脚本调用django环境
    有时我们会在django项目开发中批量生成一些测试数据,我们就可以采用如下方式 importosimportdjangoos.environ.setdefault("DJANGO_SETTINGS_MODULE","MB.setting......