zoukankan      html  css  js  c++  java
  • 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 国际许可协议进行许可,转载请标明作者及原文链接。
  • 相关阅读:
    1451. Rearrange Words in a Sentence
    1450. Number of Students Doing Homework at a Given Time
    1452. People Whose List of Favorite Companies Is Not a Subset of Another List
    1447. Simplified Fractions
    1446. Consecutive Characters
    1448. Count Good Nodes in Binary Tree
    709. To Lower Case
    211. Add and Search Word
    918. Maximum Sum Circular Subarray
    lua 时间戳和时间互转
  • 原文地址:https://www.cnblogs.com/sunpong/p/13737297.html
Copyright © 2011-2022 走看看