• go练手:简单的单词格式转换工具


    声明

    ​ 代码引自书籍 《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: 驼峰转下划线",
    }, "
    ")
    
    
    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)
    }
    

    执行效果如下


    原文作者:大鹏SP
    版权声明:本文采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请标明作者及原文链接。
  • 相关阅读:
    化学1(chem1)- 化学合成
    清空mailq 队列里面的邮件
    心情随笔20180717
    English trip -- VC(情景课)2 D Reading
    English trip -- VC(情景课)2 C Where's my pencli?
    linux使用flock文件锁
    English trip -- VC(情景课)1 C What's your name?(review)
    win10 WiFi 密码查询 命令
    English trip -- Phonics 3 元音字母e
    English trip -- VC(情景课)2 B Classroom objects
  • 原文地址:https://www.cnblogs.com/sunpong/p/13737297.html
Copyright © 2020-2023  润新知