String Handling在程式中非常常見,也是學習過程的必修課之一。本文記錄了使用Golang處理String的常見方法。
string is the set of all strings of 8-bit bytes, conventionally but not necessarily representing UTF-8-encoded text. A string may be empty, but not nil. Values of string type are immutable.
本質上,string是一串byte (byte slice, 1 byte=8 bits),而Golang的bytes類等於uint8。bytes按照UTF-8 encode後產生對應的character (字元)。
由於每個1 byte只有8 bits,因此並不能代表所有UTF-8 encoded字元,例如中文字、emoji等,所以golang另外有rune
type處理這些字元。
從 runtime/string.go 可見Golang runtime對string的定義是由byte pointer跟一個int組成。
nil
Golang有自己一套對null (空值) 的處理。對於String type而言,是沒有nil的,只有預設值""
(empty string)。
這段code會報錯:
雖然可以通過 str==""
檢查null string,但是對於某些情況而言,empty string跟null string有其各自的意義,並不對等。因此會使用*string
(pointer of string) 處理需要null string的情況。
len()
因為string是一串bytes,即byte slice。可以通過len(string)
找出string的長度。
跨行的string有兩種表達方式,分別是使用""
跟``
:
等於
+
fmt.Sprint
, fmt.Sprintln
, fmt.Sprintf
Sprint
亦可以將不同類型的variable轉換成String:
strings.Join()
bytes.Buffer
使用strconv package
如果你知道要刪除的substring是什麼,可以使用bytes.Buffer
:
使用rune
可以處理更多的UTF-8字元,包含中文字、emoji等全形字。
使用byte slice去表示中文時可以發現,golang會使用多於一個byte去表示中文字元,例如:
一個例子:validateComment
會用 * 取代comment中的特定字眼,其中comment可以包含全形字。strings.Builder.WriteRune
就可以直接寫入全形字元。
這個例子同時展示了,如何還原ToLower
後的String。