字符串是 UTF-8 字符的一個序列(當(dāng)字符為 ASCII 碼時則占用 1 個字節(jié)腔稀,其它字符根據(jù)需要占用 2-4 個字節(jié))盆昙。UTF-8 是被廣泛使用的編碼格式,是文本文件的標(biāo)準(zhǔn)編碼焊虏,其它包括 XML 和 JSON 在內(nèi)淡喜,也都使用該編碼。由于該編碼對占用字節(jié)長度的不定性诵闭,Go 中的字符串也可能根據(jù)需要占用 1 至 4 個字節(jié)炼团,這與其它語言如 C++、Java 或者 Python 不同(Java 始終使用 2 個字節(jié))疏尿。Go 這樣做的好處是不僅減少了內(nèi)存和硬盤空間占用瘟芝,同時也不用像其它語言那樣需要對使用 UTF-8 字符集的文本進(jìn)行編碼和解碼。
字符串是一種值類型褥琐,且值不可變锌俱,即創(chuàng)建某個文本后你無法再次修改這個文本的內(nèi)容;更深入地講敌呈,字符串是字節(jié)的定長數(shù)組贸宏。
Go 支持以下 2 種形式的字面值:
解釋字符串:
該類字符串使用雙引號括起來,其中的相關(guān)的轉(zhuǎn)義字符將被替換驱富,這些轉(zhuǎn)義字符包括:
\n :換行符
\r :回車符
\t :tab 鍵
\u 或 \U :Unicode 字符
\\ :反斜杠自身
非解釋字符串:
該類字符串使用反引號括起來锚赤,支持換行,例如:
兩個字符串 s1 和 s2 可以通過 s := s1 + s2 拼接在一起褐鸥。
拼接的簡寫形式 += 也可以用于字符串.
s:= "hel" + "lo,"
s += "world!"fmt.Println(s)
//輸出 “hello, world!”
在循環(huán)中使用加號 + 拼接字符串并不是最高效的做法线脚,更好的辦法是使用函數(shù) strings.Join()
有沒有更好地辦法了?有叫榕!使用字節(jié)緩沖( bytes.Buffer )拼接更加給力.
字符串處理相關(guān)函數(shù)
作為一種基本數(shù)據(jù)結(jié)構(gòu)浑侥,每種語言都有一些對于字符串的預(yù)定義處理函數(shù)。Go 中使用 strings 包來完成對字符串的主要操作晰绎。
HasPrefix 判斷字符串 s 是否以 prefix 開頭:strings.HasPrefix(s, prefix string) bool
HasSuffix 判斷字符串 s 是否以 suffix 結(jié)尾: 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 中最后出現(xiàn)位置的索引( str 的第一個字符的索引),-1 表示字符串 s 不包含字符串 str :?strings.LastIndex(s, str string) int
如果 ch 是非 ASCII 編碼的字符荞下,建議使用以下函數(shù)來對字符進(jìn)行定位: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 中出現(xiàn)的非重疊次數(shù):strings.Count(s, str string) int?
Repeat 用于重復(fù) count 次字符串 s 并返回一個新的字符串:strings.Repeat(s, count int) string?
ToLower 將字符串中的 Unicode 字符全部轉(zhuǎn)換為相應(yīng)的小寫字符:strings.ToLower(s) string
ToUpper 將字符串中的 Unicode 字符全部轉(zhuǎn)換為相應(yīng)的大寫字符:strings.ToUpper(s) string
你可以使用 strings.TrimSpace(s) 來剔除字符串開頭和結(jié)尾的空白符號尖昏;如果你想要剔除指定字符仰税,則可以使用strings.Trim(s, "cut") 來將開頭和結(jié)尾的 cut 去除掉。該函數(shù)的第二個參數(shù)可以包含任何字符抽诉,如果你只想剔除開頭或者結(jié)尾的字符串陨簇,則可以使用 TrimLeft 或者 TrimRight 來實現(xiàn)。
strings.Fields(s) 將會利用 1 個或多個空白符號來作為動態(tài)長度的分隔符將字符串分割成若干小塊迹淌,并返回一個slice河绽,如果字符串只包含空白符號己单,則返回一個長度為 0 的 slice。
strings.Split(s, sep) 用于自定義分割符號來對指定字符串進(jìn)行分割耙饰,同樣返回 slice纹笼。因為這 2 個函數(shù)都會返回 slice,所以習(xí)慣使用 for-range 循環(huán)來對其進(jìn)行處理苟跪。Join 用于將元素類型為 string 的 slice 使用分割符號來拼接組成一個字符串:strings.Join(sl []string, sep string) string
函數(shù) strings.NewReader(str) 用于生成一個 Reader 并讀取字符串中的內(nèi)容允乐,然后返回指向該 Reader 的指針,從其它類型讀取內(nèi)容的函數(shù)還有:Read() 從 []byte 中讀取內(nèi)容削咆。
ReadByte() 和 ReadRune() 從字符串中讀取下一個 byte 或者 rune與字符串相關(guān)的類型轉(zhuǎn)換都是通過 strconv 包實現(xiàn)的。
該包包含了一些變量用于獲取程序運(yùn)行的操作系統(tǒng)平臺下 int 類型所占的位數(shù)蠢笋,如: strconv.IntSize 拨齐。
任何類型 T 轉(zhuǎn)換為字符串總是成功的。針對從數(shù)字類型轉(zhuǎn)換到字符串昨寞,Go 提供了以下函數(shù):
strconv.Itoa(i int) string 返回數(shù)字 i 所表示的字符串類型的十進(jìn)制數(shù)瞻惋。
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int) string 將 64 位浮點型的數(shù)字轉(zhuǎn)換為字符串,其中 fmt 表示格式(其值可以是 'b' 援岩、 'e' 歼狼、 'f' 或 'g' ), prec 表示精度享怀, bitSize 則使用 32 表示 float32羽峰,用 64 表示 float64。
將字符串轉(zhuǎn)換為其它類型 tp 并不總是可能的添瓷,可能會在運(yùn)行時拋出錯誤 parsing "…": invalid argument 梅屉。
針對從字符串類型轉(zhuǎn)換為數(shù)字類型,Go 提供了以下函數(shù):
strconv.Atoi(s string) (i int, err error) 將字符串轉(zhuǎn)換為 int 型鳞贷。
strconv.ParseFloat(s string, bitSize int) (f float64, err error) 將字符串轉(zhuǎn)換為 float64 型坯汤。
利用多返回值的特性,這些函數(shù)會返回 2 個值搀愧,第 1 個是轉(zhuǎn)換后的結(jié)果(如果轉(zhuǎn)換成功)惰聂,第 2 個是可能出現(xiàn)的錯誤,因此咱筛,我們一般使用以下形式來進(jìn)行從字符串到其它類型的轉(zhuǎn)換:
val, err = strconv.Atoi(s)