【Golang】字符串首字母大小寫轉化


寫在前面

在自動化過程中,我們用得最多的可能就是字符串的處理,熟悉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庫常見用法

其實我們上面的代碼中的第六行有一種更簡單的方法,那就是標准庫unicodeIsLower()方法,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM