宣告
程式碼引自書籍 《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
- word
- go.mod
- main.go
- cmd
程式碼及說明
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)
}
執行效果如下