go語言字符串精解

學了go語言的都知道,這門語言的字符串操作和其他高級語言還有不小的差異,比如你直接len(s)和len([]rune(s))的結果可能會不一樣,原因是go語言對assii和unicode編碼的內置處理造成的,也別急,接下來我們將一起來了解go語言字符串的方方面面。

一.字符串的字符數量

在go語言中,定義一個字符串變量的規範格式是var s string := "hello, 世界",我們想要知道變量s的長度是多少,在go語言中提供了len方法可以獲取:

var s string = "hello, 世界"
slen := len(s)
fmt.Printf("len is %d",slen)

在沒有執行代碼之前,你可能會認爲這裏打印出len is 9,但是其實不是這樣的,你會得到len is 13。

那爲什麼會得到上面意味之外的結果呢?往下看....

在go語言中,len函數其實統計的是字符串的字節數量,而因爲go語言是用utf8編碼,utf8編碼是3個字節一個漢字。因此對於上面的例子來說,s字符串可以分爲"hello" ","  " " "世界",前面是7個字節,後面兩個漢字是6個字節,加起來就是13個字節了。

知道了len統計字符的方式,那我們有沒有辦法可以統計到正確的或者說是我們想要的字符長度呢? 當然可以,go語言爲我們提供了兩種方式可以獲取的一個字符串的長度

var s string = "Hello, 世界"
fmt.Println(utf8.RuneCountInString(s))  //方式1
//方式2
var runes []rune = []rune(s)
fmt.Println(len(runes))

以上兩種方式中,第一種方式很明顯,是統計utf8編碼的字符數,因爲go語言是utf8編碼的,所以可以統計出正確的字符數字9。而第二種方式又是什麼意思呢?往下看....

二、rune解惑

在go語言中,有一種以前高級語言中沒有的類型rune,那這個類型到底是什麼意思呢?

// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune rune

這是go語言中對這個類型的解釋,大概意思就是rune類型其實就是int32類型的另一個別名,它的意義就是用於從整型值中辨別字符值,說白了這個類型就是爲了解決非英語的人類語言的字符處理而專門定義的類型。

如果對rune數組做reflect.typeOf(runes).String(),你會發現,打印出來的類型其實是[]int32。

通過以上闡述,那就很好理解爲什麼前面所說的len(runes)可以拿到正確的字符數量了。因爲in32是4個字節,而漢字是3個字節,rune是計算unicode的code point的。

 

三、字符串操作

大家都知道,字符串是不可變的,想要把幾個字符串連接起來,就需要多創建幾個字符串對象。在java中,可以使用StringBuilder或者StringBuffer解決,在go語言中也提供了工具類解決這類問題。

bytes.Buffer

這個結構定義了一些方法來實現字符串之間的追加操作。比如WriteString方法Write(byte []byte)方法等。

對於字符串的其他類似分隔、查找等方法,可以在工具類strings中找到,這裏就不多贅述了,因爲通過方法名就可以很好理解使用方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章