1. 程式人生 > >go練手:簡單的單詞格式轉換工具

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** ```shell package main import ( "log" "tour/cmd" ) func main() { err := cmd.Execute() if err != nil { log.Fatalf("cmd.Execute err: %v", err) } } ``` **go.mod** ```shell module tour go 1.14 require ( github.com/spf13/cobra v1.0.0 ) ``` **cmd - root.go** 新增 wordcmd, 也就是cmd - word.go 中宣告的wordCmd ```shell 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進行模式選擇,然後執行對應方法 ```shell 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方法轉為字串 - 駝峰單詞轉下劃線單詞 遍歷字串,先把第一個字元轉為小寫,然後遇到大寫字母就在前面加個 '_' 然後再把大寫字母轉為小寫,直至遍歷完成。 ```shell 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) } ``` ### 執行效果如下 ![](https://img2020.cnblogs.com/blog/2144409/202009/2144409-20200926232958541-697489061.png) ![](https://img2020.cnblogs.com/blog/2144409/202009/2144409-20200926233004764-7749949