go練手:簡單的單詞格式轉換工具
阿新 • • 發佈:2020-09-27
### 宣告
程式碼引自書籍 《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