在所有編程語言中都涉及到大量的字符串操作,可見熟悉對字符串的操作是何等重要。 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:
108
97
111
89
117
232
128
129
232
153
158
0 Unicode( 108 ) string= l
1 Unicode( 97 ) string= a
2 Unicode( 111 ) string= o
3 Unicode( 89 ) string= Y
4 Unicode( 117 ) string= u
5 Unicode( 32769 ) string= 老
8 Unicode( 34398 ) string= 虞
rune= [108 97 111 89 117 32769 34398]
r[ 0 ]= 108 string= l
r[ 1 ]= 97 string= a
r[ 2 ]= 111 string= o
r[ 3 ]= 89 string= Y
r[ 4 ]= 117 string= u
r[ 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=5
fmt.Println("str[0]=",str[0]) //l
str :="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)) //3
fmt.Println("len(array)=",len(arr)) //5invalid argument user (type *UserInfo) for len
fmt.Println("len(slice)=",len(slice)) //5
fmt.Println("len(map)=",len(m)) //1
fmt.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 string
var arr2 [5]int
var slice2 []int
var m2 map[int] string
var ch2 chan int
fmt.Println("len(string)=",len(str2)) //0
fmt.Println("len(array)=",len(arr2)) //5
fmt.Println("len(slice)=",len(slice2)) //0
fmt.Println("len(map)=",len(m2)) //0
fmt.Println("len(chat)=",len(ch2)) //0
字符串中是否包含某字符串 func Contains(s, substr string) bool
確定是否包含某字符串,這是區分大小寫的。實際上內部是通過Index(s,sub string) int 實現的。如果索引!=-1則表示包含該字符串。空字符串""在任何字符串中均存在。
源代碼
// 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")) //false
fmt.Println(strings.Contains(str,"Go")) //true
fmt.Println(strings.Contains(str,"laoyu")) //false
fmt.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)) //true
fmt.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")) //2
fmt.Println(strings.Count("laoYuStudyGo", "O")) //0
fmt.Println(strings.Count("laoYuStudyGo", "")) //13=12+1
fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "虞")) //1
fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "Go")) //2
fmt.Println(strings.Count("laoYuStudyGo老虞學習Go語言", "老虞"))//1
fmt.Println(strings.Count("", "")) //1=0+1
fmt.Println(strings.Count("aaaaaaaa","aa")) //4
fmt.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包下的字符串操作函數,請查看
