這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
在所有程式設計語言中都涉及到大量的字串操作,可見熟悉對字串的操作是何等重要。 Go中的字串和C#中的一樣,字串內容在初始化後不可修改。 需要注意的是在Go中字串是有UTF-8編碼的,請注意儲存檔案時將檔案編碼格式改成UTF-8(特別是在windows下)。
初始化
var str string //聲明一個字串str = "laoYu" //賦值ch :=str[0] //擷取第一個字元len :=len(str) //字串的長度,len是內建函數 ,len=5
字串操作
編碼過程中避免不了中文字元,那我們該如何提取一個中文呢?首先我們要知道string[index]擷取的是字元byte,就無法像C#中"老虞"[0]
來取到‘老’,在Go中需要將字串轉換成rune數組,runne數組中就可以通過數組下標擷取一個漢字所標識的Unicode碼,再將Unicode碼按建立成字串即可。
查看範例程式碼
str :="laoYu老虞"for i:=0;i<len(str);i++ { fmt.Println(str[i])}for i,s := range str { fmt.Println(i,"Unicode(",s,") string=",string(s))}r := []rune(str)fmt.Println("rune=",r)for i:=0;i<len(r) ; i++ { fmt.Println("r[",i,"]=",r[i],"string=",string(r[i]))}Outut:10897111891172321281292321531580 Unicode( 108 ) string= l1 Unicode( 97 ) string= a2 Unicode( 111 ) string= o3 Unicode( 89 ) string= Y4 Unicode( 117 ) string= u5 Unicode( 32769 ) string= 老8 Unicode( 34398 ) string= 虞rune= [108 97 111 89 117 32769 34398]r[ 0 ]= 108 string= lr[ 1 ]= 97 string= ar[ 2 ]= 111 string= or[ 3 ]= 89 string= Yr[ 4 ]= 117 string= ur[ 5 ]= 32769 string= 老r[ 6 ]= 34398 string= 虞
對字串的操作非常重要,來瞭解下strings包中提供了哪些函數
擷取總位元組數 func Len(v type) int
len函數是Go中內建函數,不引入strings包即可使用。len(string)返回的是字串的位元組數。len函數所支援的入參類型如下:
- len(Array) 數組的元素個數
- len(*Array) 數組指標中的元素個數,如果入參為nil則返回0
- len(Slice) 數組切片中元素個數,如果入參為nil則返回0
- len(map) 字典中元素個數,如果入參為nil則返回0
- len(Channel) Channel buffer隊列中元素個數
查看範例程式碼
str :="laoYu老虞"str2 :="laoYu"fmt.Println("len(",str,")=",len(str)) //len=11=5+6,一個漢字在UTF-8>中佔3個位元組fmt.Println("len(",str2,")=",len(str2)) //len=5fmt.Println("str[0]=",str[0]) //lstr :="str"arr :=[5]int{1,2,3}slice :=make([]int,5)m :=make(map[int] string)m[2]="len"ch :=make(chan int)fmt.Println("len(string)=",len(str)) //3fmt.Println("len(array)=",len(arr)) //5invalid argument user (type *UserInfo) for lenfmt.Println("len(slice)=",len(slice)) //5fmt.Println("len(map)=",len(m)) //1fmt.Println("len(chat)=",len(ch)) //0//user :=&UserInfo{id:1,name:"laoYu"}//interger :=2//fmt.Println("len(my struct)=",len(user))//invalid argument user (type *UserInfo) for len//fmt.Println("len(interger)=",len(interger))var str2 stringvar arr2 [5]intvar slice2 []intvar m2 map[int] stringvar ch2 chan intfmt.Println("len(string)=",len(str2)) //0fmt.Println("len(array)=",len(arr2)) //5 fmt.Println("len(slice)=",len(slice2)) //0fmt.Println("len(map)=",len(m2)) //0fmt.Println("len(chat)=",len(ch2)) //0
字串中是否包含某字串 func Contains(s, substr string) bool
確定是否包含某字串,這是區分大小寫。實際上內部是通過Index(s,sub string) int 實現的。如果索引!=-1則表示包含該字串。Null 字元串""在任何字串中均存在。
原始碼
// Contains returns true if substr is within s.func Contains(s, substr string) bool { return Index(s, substr) != -1}
**樣本,使用請需匯入包:' import "strings" ' **
查看範例程式碼
str :="laoYuStudyGotrue是否包含某字串"fmt.Println(strings.Contains(str,"go")) //falsefmt.Println(strings.Contains(str,"Go")) //truefmt.Println(strings.Contains(str,"laoyu")) //falsefmt.Println(strings.Contains(str,"是")) //true fmt.Println(strings.Contains(str,"")) //true
在實際工作中常需要在不區分大小寫情況下確認是否包含某字串,(我們應該減少這種情況,以免每次驗證時都需要進行一次大小寫轉換)。 這裡我局部修改原始碼提供一個驗證字串中是否包含某字串的函數,當然你也可以直接使用strings.Contains(strings.ToLower(s),strings.ToLower(substr))
str := "laoYuStudyGotrue是否包含某字串"fmt.Println(Contains(str, "go", true)) //truefmt.Println(Contains(str,"go",false)) //false
//在字串s中是否包含字串substr,ignoreCase表示是否忽略大小寫 func Contains(s string, substr string, ignoreCase bool) bool { return Index(s, substr, ignoreCase) != -1 } //字串subst在字串s中的索引位置,ignoreCase表示是否忽略大小寫 func Index(s string, sep string, ignoreCase bool) int { n := len(sep) if n == 0 { return 0 } //to Lower if ignoreCase == true { s = strings.ToLower(s) sep = strings.ToLower(sep) } c := sep[0] if n == 1 { // special case worth making fast for i := 0; i < len(s); i++ { if s[i] == c { return i } } return -1 } // n > 1 for i := 0; i+n <= len(s); i++ { if s[i] == c && s[i:i+n] == sep { return i } } return -1 }
擷取字串sep在字串s中出現的次數 Count(s,sep string)
注意:如果sep="",則無論s為何字串都會返回 len(s)+1
查看範例程式碼
fmt.Println(strings.Count("laoYuStudyGo", "o")) //2fmt.Println(strings.Count("laoYuStudyGo", "O")) //0fmt.Println(strings.Count("laoYuStudyGo", "")) //13=12+1fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "虞")) //1fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "Go")) //2fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "老虞"))//1fmt.Println(strings.Count("", "")) //1=0+1fmt.Println(strings.Count("aaaaaaaa","aa")) //4fmt.Println(strings.Count("laoYuStudyGo_n","\n")) //0
**使用(多個)空格分割字串 Fields(s string) ,返回分割後的數組 **
將字串分割成數組,其分割符為空白格。
查看範例程式碼
fmt.Println(strings.Fields("lao Yu Study Go ")) //OutPut: [lao Yu Study Go]fmt.Println(strings.Fields(" Go ")) //[Go]fmt.Println(strings.Fields("")) //[]fmt.Println(strings.Fields(" \n go")) //[go]
**其實其內部實現調用的是FieldsFunc(s,unicode.IsSpace),我們也可以自訂分割方式 **
canSplit := func (c rune) bool { return c=='#'}fmt.Println(strings.FieldsFunc("lao###Yu#Study####Go#G ",canSplit)) //[lao Yu Study Go G<space>]
檢查字串是否已某字串開頭 HasPrefix(s,prefix string) bool
如果想查看更多關於strings包下的字串操作函數,請查看