GO語(yǔ)言字符串常用操作小結(jié)
字符串簡(jiǎn)介
字符串是一段固定長(zhǎng)度字符連接起來的字符序列,GO語(yǔ)言中的字符串是由單個(gè)字節(jié)連起來的,其字符串字節(jié)是由 UTF-8 編碼來表示unicode 文本的。
由于該編碼占用字節(jié)長(zhǎng)度的不確定性,所以在GO語(yǔ)言中,字符串會(huì)根據(jù)需要占用 1~4 個(gè)字節(jié),這于其他編程語(yǔ)言不同(比如 c++ python java)比如說Java字符串始終占用2個(gè)字節(jié)。GO這樣做不僅減少了內(nèi)存和硬盤的占用,也不需要其他語(yǔ)言那樣對(duì) UTF-8 進(jìn)行編解碼。
GO中字符串和Java中字符串一樣,其值是不可變的(創(chuàng)建之后要修改,只會(huì)將指針指向新的字符串),當(dāng)代碼中存在字符串,編譯器會(huì)將其標(biāo)記成只讀數(shù)據(jù) SRODATA
常用方法
中文字符串截取
在GO中我們可以直接通過切片來截取字符串,但是當(dāng)截取的字符串是中文的時(shí)候就要注意了,在GO中,英文是占用一個(gè)字節(jié)的,中文占用的的是3個(gè)字節(jié),當(dāng)我們直接用切片截取的時(shí)候,可能會(huì)將中文的編碼截成兩半,結(jié)果就是最后那個(gè)字是一個(gè)亂碼。
這里比較推薦使用 rune 數(shù)組來截取字符串,截取后再轉(zhuǎn)為字符串。通過 rune 截取的不是字節(jié)了,該數(shù)組每一條都存儲(chǔ)這一個(gè)字(英文字母,中文漢字)
示例如下:示例
package main import ( ?? ?"fmt" ?? ?"unicode/utf8" ) func main() { ?? ?// 聲明一個(gè)字符串 ?? ?str := "這是一串字符串,測(cè)試 go 的方法" ?? ?// 字符串長(zhǎng)度 ?? ?fmt.Println(utf8.RuneCountInString(str)) ?? ?// 字節(jié)長(zhǎng)度 ?? ?fmt.Println(len(str)) ?? ?// 這個(gè)截取是按字節(jié)來截取的 ?? ?str1 := str[0:9] ?? ?fmt.Println(str1) ?? ?// 一個(gè)中文占用3個(gè)字節(jié),當(dāng)截取10個(gè)字節(jié)時(shí)候,最后一個(gè)漢字就會(huì)發(fā)生亂碼 ?? ?str2 := str[0:10] ?? ?fmt.Println(str2) ?? ?// 將字符串轉(zhuǎn)為 rune 數(shù)組,然后截取再轉(zhuǎn)回字符串 ?? ?strRune := []rune(str) ?? ?fmt.Println(len(strRune)) ?? ?// 注意了這里不是字節(jié)了,而是4個(gè)字 ?? ?fmt.Println(string(strRune[0:4])) } //輸出 //17 //43 //這是一 //這是一? //17 //這是一串
反轉(zhuǎn)字符串
這里還是用到了上面用的 rune 數(shù)組,先轉(zhuǎn)為 rune 數(shù)組類型,反轉(zhuǎn)后,再轉(zhuǎn)回字符即可。示例
package main import "fmt" func main() { ?? ?a := "123345asdfg" ?? ?reverseStr := reverseString(a) ?? ?fmt.Println(reverseStr) } func reverseString(a string) string { ?? ?b := []rune(a) ?? ?for i := 0; i < len(b)/2; i++ { ?? ??? ?// 注意:不可以像下面這樣寫哦 ?? ??? ?//b[i] = b[len(b)-i-1] ?? ??? ?//b[len(b)-i-1] = b[i] ?? ??? ?// 可以理解為將兩個(gè)都先取出來再同時(shí)賦值,不得不說還是很簡(jiǎn)便的,否則就需要一個(gè)第三方變量才能完成互換 ?? ??? ?b[i], b[len(b)-i-1] = b[len(b)-i-1], b[i] ?? ?} ?? ?return string(b) } // gfdsa543321
字符串大小寫操作
這個(gè)就很簡(jiǎn)單了,直接調(diào)用 strings 包下提供的兩個(gè)方法就可以了
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := "Hello World" ?? ?// 所有字母轉(zhuǎn)為大寫 ?? ?upper := strings.ToUpper(str) ?? ?fmt.Println(upper) ?? ?// 所有字母轉(zhuǎn)為小寫 ?? ?lower := strings.ToLower(str) ?? ?fmt.Println(lower) }
去除字符串首位空格
可以使用 strings 包下的方法 TrimSpace() ?,或者使用 Trim() ?方法,該方法可以刪除字符串中連續(xù)字符,用來刪除空格當(dāng)然也是可以的
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := " GO 非常好用 " ?? ?// 刪除連續(xù)字符 ?? ?str1 := strings.Trim(str, " ") ?? ?// 刪除首位空格 ?? ?str2 := strings.TrimSpace(str) ?? ?fmt.Println(str) ?? ?fmt.Println(str2) ?? ?fmt.Println(str1) }
合并字符串
join() 用于將字符串切片拼接為字符串,第一個(gè)參數(shù)傳字符切片,第二個(gè)是連接符,下面示例中就是使用的空格連接
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := []string{"I", "Love", "GO"} ?? ?res := strings.Join(str, " ") ?? ?fmt.Println(res) }
分割字符串
strings 包提供了 Split()、SplitN、SplitAfter、SplitAfterN() ?4個(gè)函數(shù)來處理正則分割字符串
func Splic(s,sep string) []string
其中 s 為被正則分割的字符串,sep為分隔符
func SplicN(s,sep string,n int) []string
其中,s 為被正則分割的字符串,sep為分隔符,n為控制分割的片數(shù),如果為 -1 則不限制
func SplicAfter(s,sep string) []string
與上面方法功能相同但是會(huì)保留分割符
func Splic(s,sep string) []string
與上面方法功能相同但是會(huì)保留分割符
package main import ( ?? ?"fmt" ?? ?"strings" ) func main() { ?? ?str := "I_Love_Golang_web" ?? ?split1 := strings.Split(str, "_") ?? ?split2 := strings.SplitN(str, "_", 3) ?? ?split3 := strings.SplitAfter(str, "_") ?? ?split4 := strings.SplitAfterN(str, "_", 2) ?? ?for i := range split1 { ?? ??? ?fmt.Println(split1[i]) ?? ?} ?? ?// I ?? ?// Love ?? ?// Golang ?? ?// web ?? ?for i := range split2 { ?? ??? ?fmt.Println(split2[i]) ?? ?} ?? ?// I ?? ?// Love ?? ?// Golang_web ?? ?for i := range split3 { ?? ??? ?fmt.Println(split3[i]) ?? ?} ?? ?// I_ ?? ?// Love_ ?? ?// Golang_ ?? ?// web ?? ?for i := range split4 { ?? ??? ?fmt.Println(split4[i]) ?? ?} ?? ?// I_ ?? ?// Love_Golang_web }
到此這篇關(guān)于GO 語(yǔ)言字符串常用操作集錦的文章就介紹到這了,更多相關(guān)GO 字符串常用操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang使用sync.singleflight解決熱點(diǎn)緩存穿透問題
在go的sync包中,有一個(gè)singleflight包,里面有一個(gè)?singleflight.go文件,代碼加注釋,一共200行出頭,通過?singleflight可以很容易實(shí)現(xiàn)緩存和去重的效果,避免重復(fù)計(jì)算,接下來我們就給大家詳細(xì)介紹一下sync.singleflight如何解決熱點(diǎn)緩存穿透問題2023-07-07Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹必會(huì)知識(shí)點(diǎn)總結(jié)
如果你是一個(gè)開發(fā)人員,或多或少對(duì)樹型結(jié)構(gòu)都有一定的認(rèn)識(shí)。二叉樹作為樹的一種,是一種重要的數(shù)據(jù)結(jié)構(gòu),也是面試官經(jīng)??嫉臇|西。本文為大家總結(jié)了一些二叉樹必會(huì)知識(shí)點(diǎn),需要的可以參考一下2022-08-08golang Goroutine超時(shí)控制的實(shí)現(xiàn)
日常開發(fā)中我們大概率會(huì)遇到超時(shí)控制的場(chǎng)景,比如一個(gè)批量耗時(shí)任務(wù)、網(wǎng)絡(luò)請(qǐng)求等,本文主要介紹了golang Goroutine超時(shí)控制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09Go語(yǔ)言入門學(xué)習(xí)之Channel通道詳解
go routine可以使用channel來進(jìn)行通信,使用通信的手段來共享內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言入門學(xué)習(xí)之Channel通道的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07