Go strings 系統(tǒng)包的使用說(shuō)明
前文我們有學(xué)習(xí)了 string 變量,發(fā)現(xiàn) Go 語(yǔ)言并沒(méi)有向面向?qū)ο笳Z(yǔ)言那樣,類型中自帶方法來(lái)處理對(duì)象的值。Go語(yǔ)言中也有類似的操作,其操作全都在?strings 系統(tǒng)包中實(shí)現(xiàn)了。本文主要來(lái)講解一下如何使用 strings 系統(tǒng)包比較常用的字符串操作。
1. 獲取字符串長(zhǎng)度
在往數(shù)據(jù)庫(kù)中寫入數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫(kù)字段通常都會(huì)有長(zhǎng)度限制,所以在寫入之前最好事先判斷一下字符串的長(zhǎng)度是否符合自己的設(shè)計(jì)。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := "Hello Codey!"
- 10? ? ? ?
fmt.Println(len(str))
- 11? ? ? ?
fmt.Println(strings.Count(str, "")-1)
- 12?
}
執(zhí)行結(jié)果:

其實(shí)獲取字符串長(zhǎng)度常用的是用?len()
?函數(shù)去獲取,因?yàn)?sring 的本質(zhì)是一個(gè) rune 切片,所以?len()
?對(duì) string 也是可以直接使用的。如果想要通過(guò) strings 包來(lái)獲取長(zhǎng)度,我們可以通過(guò)?strings.Count(str,s string)int
?來(lái)迂回達(dá)到目的,尋找字符串中的空字符串的個(gè)數(shù)就相當(dāng)于尋找字符之間的空隙(包括字符首尾),所以得到的數(shù)字就是長(zhǎng)度+1,我們得到結(jié)果后再減去1,就可以得到字符串的長(zhǎng)度了。
2. 比較字符串
在開發(fā)大小寫不敏感的應(yīng)用場(chǎng)景時(shí),比如說(shuō)地名的英文縮寫。一般情況我們都將字符串轉(zhuǎn)換為大寫或者小寫再進(jìn)行比較。Go 語(yǔ)言中的 strings 包中專門提供了一個(gè)大小寫不敏感的比較函數(shù)——strings.EqualFold(str1,str2 string)bool
。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str1 := "Hello Codey!"
- 10? ? ? ?
str2 := "heLLo coDEy!"
- 11? ? ? ?
fmt.Println(strings.EqualFold(str1, str2))
- 12?
}
執(zhí)行結(jié)果:

3. 字符串分割
Go 語(yǔ)言中也是可以支持根據(jù)特定字符串將字符串分割為字符串?dāng)?shù)組的操作。通過(guò)使用?strings.Split(s, sep string) []string
?來(lái)實(shí)現(xiàn)
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := "Hello Codey!"
- 10? ? ? ?
fmt.Println(strings.Split(str, " "))//使用空格字符串去分割str
- 11?
}
執(zhí)行結(jié)果:

4. 前后綴的判斷
在執(zhí)行文件操作的時(shí)候,經(jīng)常會(huì)用到的前后綴的操作,比如獲取日志文件的時(shí)候,獲取 .log 結(jié)尾,同時(shí)還要以2020?5?開頭的文件,就需要判斷前后綴是否含有這些字符串,Go 語(yǔ)言的前綴判斷是使用?strings.HasPrefix(s, prefix string``)bool
,而后綴是使用?strings.HasSuffix(s, prefix string``)bool
。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := "2020_5_20.log"
- 10? ? ? ?
fmt.Println(strings.HasPrefix(str, "2020_5_"))
- 11? ? ? ?
fmt.Println(strings.HasSuffix(str, ".log"))
- 12?
}
執(zhí)行結(jié)果:

5. 去除前后空格
在處理前端輸入的數(shù)據(jù)的時(shí)候,有時(shí)會(huì)需要去除前后空格。Go 語(yǔ)言中使用?strings.TrimSpace(s string)string
?來(lái)執(zhí)行這個(gè)操作。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := " Hello Codey! "
- 10? ? ? ?
fmt.Println(strings.TrimSpace(str))
- 11?
}
執(zhí)行結(jié)果:

6. 將字符串?dāng)?shù)組拼接為字符串
Go 語(yǔ)言中使用?strings.Join(a ``[]string, ``sep string) string
?來(lái)將字符串?dāng)?shù)組,根據(jù)你想要的字符串進(jìn)行拼接成為一個(gè)字符串。
代碼示例:
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := []string{"Hello", "Hi"}
- 10? ? ? ?
fmt.Println(strings.Join(str, ","))//使用逗號(hào)拼接字符串
- 11?
}
執(zhí)行結(jié)果:

7. 字符串替換
Go 語(yǔ)言中使用?strings.Replace(s, old, new string, n int) string
?來(lái)進(jìn)行字符串替換,n<0 時(shí)替換字符串中左右舊字符子串。
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"strings"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
str := "Hello Codey!"
- 10? ? ? ?
fmt.Println(strings.Replace(str, "Hello", "Hi", -1))//將str中所有Hello替換為Hi
- 11?
}
執(zhí)行結(jié)果:

8. 小結(jié)
本文主要介紹了 Go 語(yǔ)言的一個(gè)字符串操作包,這個(gè)包里面還有很多其它對(duì)字符串的操作,有興趣的讀者可以繼續(xù)研究。本文介紹的主要就是些開發(fā)中常用的字符串操作,在我的開發(fā)經(jīng)歷中還是字符串的分割和替換用的最多,大家要注意的是?Go 語(yǔ)言中的字符串是變量,并不是對(duì)象,每次修改完字符串其實(shí)都會(huì)使用一個(gè)新的內(nèi)存,所以在內(nèi)存不充足的場(chǎng)景要慎用字符串操作。
文章來(lái)源于網(wǎng)絡(luò),侵刪!