单词格式转换工具

时间:2024-02-01 15:08:21

声明

​ 代码引自书籍 《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
    • 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)
}

执行效果如下