golang學(xué)習(xí)筆記5:字符串及相關(guān)函數(shù)

字符串是 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)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末搓幌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子眷蚓,更是在濱河造成了極大的恐慌鼻种,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沙热,死亡現(xiàn)場離奇詭異叉钥,居然都是意外死亡罢缸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門投队,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枫疆,“玉大人,你說我怎么就攤上這事敷鸦∠⑿ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵扒披,是天一觀的道長值依。 經(jīng)常有香客問我,道長碟案,這世上最難降的妖魔是什么愿险? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮价说,結(jié)果婚禮上辆亏,老公的妹妹穿的比我還像新娘。我一直安慰自己鳖目,他們只是感情好扮叨,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著领迈,像睡著了一般彻磁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸捅,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天兵迅,我揣著相機(jī)與錄音,去河邊找鬼薪贫。 笑死恍箭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瞧省。 我是一名探鬼主播扯夭,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鞍匾!你這毒婦竟也來了交洗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤橡淑,失蹤者是張志新(化名)和其女友劉穎构拳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡置森,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年斗埂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凫海。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡呛凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出行贪,到底是詐尸還是另有隱情漾稀,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布建瘫,位于F島的核電站崭捍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏啰脚。R本人自食惡果不足惜缕贡,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拣播。 院中可真熱鬧,春花似錦收擦、人聲如沸贮配。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泪勒。三九已至,卻和暖如春宴猾,著一層夾襖步出監(jiān)牢的瞬間圆存,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工仇哆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留沦辙,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓讹剔,卻偏偏與公主長得像油讯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子延欠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容