go練手:簡單的單詞格式轉換工具

大鵬SP發表於2020-09-26

宣告

​ 程式碼引自書籍 《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)
}

執行效果如下


相關文章