寫在前面
在自動化過程中,我們用得最多的可能就是字符串的處理,熟悉Python的都知道在Python中要讓一個字符串的首字母大寫直接用capitalize
就可以了,但是同樣的事情在Golang中沒有這么簡單,今天我們一起來學習用golang實現字符串首字母大寫。
# Python實現首字母大寫
print("abcd".capitalize()) # 輸出Abcd
實現首字母大寫
我們先來一起來看一下完整的代碼,后面會對其中的一些內容進行分解。
示例代碼
// Capitalize 字符首字母大寫
func Capitalize(str string) string {
var upperStr string
vv := []rune(str) // 后文有介紹
for i := 0; i < len(vv); i++ {
if i == 0 {
if vv[i] >= 97 && vv[i] <= 122 { // 后文有介紹
vv[i] -= 32 // string的碼表相差32位
upperStr += string(vv[i])
} else {
fmt.Println("Not begins with lowercase letter,")
return str
}
} else {
upperStr += string(vv[i])
}
}
return upperStr
}
rune
我們在第三行看到了rune
這個關鍵字,那么rune是什么呢?rune在golang中是int32的別名,在各個方面都與int32相同。通常被用來區分字符值和整數值。 我們可以通過做幾個小測試來理解它。
s := "hello你好"
fmt.Println(len(s)) // 輸出長度為11
fmt.Println(len([]rune(s))) // 輸出長度為7
s = "你好"
fmt.Println(len(s)) // 輸出長度為6
fmt.Println(len([]rune(s))) // 輸出長度為2
s = "你"
fmt.Println([]byte(s)) // 輸出長度為6
fmt.Println(rune('你')) // 輸出20320
通過上述代碼可以將rune理解為一個可以表示unicode 編碼的值int 的值,稱為碼點(code point)。只不過go語言把這個碼點抽象為rune。
想要更深入的了解可以查看這個博客:https://blog.golang.org/strings ,講述了 Strings, bytes, runes and characters in Go。
在了解了rune可以表示為unicode 編碼的值int 的值之后,我們來了解一下unicode 編碼值。
unicode編碼表
一起來看一下Unicode的編碼表
字符 | 十進制編碼值 | 十六進制編碼值 |
---|---|---|
A | 65 | 41 |
B | 66 | 42 |
C | 67 | 43 |
D | 68 | 44 |
... | ... | ... |
a | 97 | 61 |
b | 98 | 62 |
c | 99 | 63 |
d | 100 | 64 |
... | ... | ... |
看過Unicode的編碼表之后我們發現了一個規律,那就是十進制編碼時,大小寫編碼之間相差了32,十六進制相差了20。既然我們知道了rune能獲取字符的Unicode編碼值,又知道了大小寫字母的編碼規律,接下來用他們做字母大寫的變化就非常容易了。
更多 Unicode的編碼可以參考 https://blog.csdn.net/fedawn/article/details/7307993
Unicode庫常見用法
其實我們上面的代碼中的第六行有一種更簡單的方法,那就是標准庫unicode
的IsLower()
方法,unicode庫還有很多其他類似的方法:
unicode.IsUpper(r) // 是否大寫
unicode.IsLetter(r) // 是否字母
unicode.IsSpace(r) // 是否空格
unicode.IsTitle(r) // 是否特殊字符
unicode.IsDigit(r) //是否數字
...
更多的用法可以參考 https://blog.csdn.net/chenbaoke/article/details/40318215
簡單應用:判斷首字母是否大寫
func IsStartUpper(s string) bool {
return unicode.IsUpper([]rune(s)[0])
}
參考資料:
https://blog.golang.org/strings
https://blog.csdn.net/a41888313/article/details/78946911
https://blog.csdn.net/fedawn/article/details/7307993
https://blog.csdn.net/yang8023tao/article/details/53332827