golang學習筆記5:字串及相關函式
字串是 UTF-8 字元的一個序列(當字元為 ASCII 碼時則佔用 1 個位元組,其它字元根據需要佔用 2-4 個位元組)。UTF-8 是被廣泛使用的編碼格式,是文字檔案的標準編碼,其它包括 XML 和 JSON 在內,也都使用該編碼。由於該編碼對佔用位元組長度的不定性,Go 中的字串也可能根據需要佔用 1 至 4 個位元組,這與其它語言如 C++、Java 或者 Python 不同(Java 始終使用 2 個位元組)。Go 這樣做的好處是不僅減少了記憶體和硬碟空間佔用,同時也不用像其它語言那樣需要對使用 UTF-8 字符集的文字進行編碼和解碼。
字串是一種值型別,且值不可變,即建立某個文字後你無法再次修改這個文字的內容;更深入地講,字串是位元組的定長陣列。
Go 支援以下 2 種形式的字面值:
解釋字串:
該類字串使用雙引號括起來,其中的相關的轉義字元將被替換,這些轉義字元包括:
\n :換行符
\r :回車符
\t :tab 鍵
\u 或 \U :Unicode 字元
\\ :反斜槓自身
非解釋字串:
該類字串使用反引號括起來,支援換行,例如:
兩個字串 s1 和 s2 可以通過 s := s1 + s2 拼接在一起。
拼接的簡寫形式 += 也可以用於字串.
s:= "hel" + "lo," s += "world!"fmt.Println(s) //輸出 “hello, world!”
在迴圈中使用加號 + 拼接字串並不是最高效的做法,更好的辦法是使用函式 strings.Join()
有沒有更好地辦法了?有!使用位元組緩衝( bytes.Buffer )拼接更加給力.
字串處理相關函式
作為一種基本資料結構,每種語言都有一些對於字串的預定義處理函式。Go 中使用 strings 包來完成對字串的主要操作。
HasPrefix 判斷字串 s 是否以 prefix 開頭:strings.HasPrefix(s, prefix string) bool
HasSuffix 判斷字串 s 是否以 suffix 結尾: strings.HasSuffix(s, suffix string) bool
Contains 判斷字串 s 是否包含 substr :strings.Contains(s, substr string) bool
Index 返回字串 str 在字串 s 中的索引( str 的第一個字元的索引),-1 表示字串 s不包含字串 str :strings.Index(s, str string) int
LastIndex 返回字串 str 在字串 s 中最後出現位置的索引( str 的第一個字元的索引),-1 表示字串 s 不包含字串 str : strings.LastIndex(s, str string) int
如果 ch 是非 ASCII 編碼的字元,建議使用以下函式來對字元進行定位:strings.IndexRune(s string, r rune) int
Replace 用於將字串 str 中的前 n 個字串 old 替換為字串 new ,並返回一個新的字串,
如果 n = -1 則替換所有字串 old 為字串 new :strings.Replace(str, old, new, n) string
Count 用於計算字串 str 在字串 s 中出現的非重疊次數:strings.Count(s, str string) int
Repeat 用於重複 count 次字串 s 並返回一個新的字串:strings.Repeat(s, count int) string
ToLower 將字串中的 Unicode 字元全部轉換為相應的小寫字元:strings.ToLower(s) string
ToUpper 將字串中的 Unicode 字元全部轉換為相應的大寫字元:strings.ToUpper(s) string
你可以使用 strings.TrimSpace(s) 來剔除字串開頭和結尾的空白符號;如果你想要剔除指定字元,則可以使用strings.Trim(s, "cut") 來將開頭和結尾的 cut 去除掉。該函式的第二個引數可以包含任何字元,如果你只想剔除開頭或者結尾的字串,則可以使用 TrimLeft 或者 TrimRight 來實現。
strings.Fields(s) 將會利用 1 個或多個空白符號來作為動態長度的分隔符將字串分割成若干小塊,並返回一個slice,如果字串只包含空白符號,則返回一個長度為 0 的 slice。
strings.Split(s, sep) 用於自定義分割符號來對指定字串進行分割,同樣返回 slice。因為這 2 個函式都會返回 slice,所以習慣使用 for-range 迴圈來對其進行處理。Join 用於將元素型別為 string 的 slice 使用分割符號來拼接組成一個字串:strings.Join(sl []string, sep string) string
函式 strings.NewReader(str) 用於生成一個 Reader 並讀取字串中的內容,然後返回指向該 Reader 的指標,從其它型別讀取內容的函式還有:Read() 從 []byte 中讀取內容。
ReadByte() 和 ReadRune() 從字串中讀取下一個 byte 或者 rune與字串相關的型別轉換都是通過 strconv 包實現的。
該包包含了一些變數用於獲取程式執行的作業系統平臺下 int 型別所佔的位數,如: strconv.IntSize 。
任何型別 T 轉換為字串總是成功的。針對從數字型別轉換到字串,Go 提供了以下函式:
strconv.Itoa(i int) string 返回數字 i 所表示的字串型別的十進位制數。
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string 將 64 位浮點型的數字轉換為字串,其中 fmt 表示格式(其值可以是 'b' 、 'e' 、 'f' 或 'g' ), prec 表示精度, bitSize 則使用 32 表示 float32,用 64 表示 float64。
將字串轉換為其它型別 tp 並不總是可能的,可能會在執行時丟擲錯誤 parsing "…": invalid argument 。
針對從字串型別轉換為數字型別,Go 提供了以下函式:
strconv.Atoi(s string) (i int, err error) 將字串轉換為 int 型。
strconv.ParseFloat(s string, bitSize int) (f float64, err error) 將字串轉換為 float64 型。
利用多返回值的特性,這些函式會返回 2 個值,第 1 個是轉換後的結果(如果轉換成功),第 2 個是可能出現的錯誤,因此,我們一般使用以下形式來進行從字串到其它型別的轉換:
val, err = strconv.Atoi(s)
