Go字符串 && strings包html
在Go中string底層是用byte數組存的,而且是不能夠改變的。git
以下代碼所示,github
package main import "fmt" func main() { var str string = "hello world"; //多行字符串中不能夠使用轉移字符 var msg string = `hello world! what's wrong with you?` fmt.Println(str) fmt.Println(msg) //按照原格式打印出來 var format string = "hello %s \n" //單行字符串中能夠使用轉移字符 fmt.Printf(format, "world") }
Go 語言中的字符串是以 UTF-8 格式編碼並存儲的,例如:數組
s := "Hello 世界!"
變量 s 中存放的是這個字符串的 UTF-8 編碼,當你使用 len(s) 函數獲取字符串的長度時,獲取的是該字符串的 UTF-8 編碼長度。一般咱們認爲,在電腦中存儲一個 ASCII 字符須要一個字節,存儲一個非 ASCII 字符須要兩個字節,這種認爲僅僅是針對 Windows 系統中經常使用的 ANSI 編碼而言的,而在 Go 語言中,使用的是 UTF-8 編碼,用 UTF-8 編碼來存放一個 ASCII 字符依然只須要一個字節,而存放一個非 ASCII 字符,則須要 2個、3個、4個字節,它是不固定的。函數
既然 Go 中的字符串存放的是 UTF-8 編碼,那麼咱們使用 s[0] 這樣的下標方式獲取到的內容就是 UTF-8 編碼中的一個字節。對於非 ASCII 字符而言,這樣的一個字節沒有實際的意義,除非你想編碼或解碼 UTF-8 字節流。而在 Go 語言中,已經有不少現成的方法來編碼或解碼 UTF-8 字節流了。編碼
遍歷字符串中的字節(使用下標訪問):spa
s := "Hello 世界!" //字符串底層使用byte數組存儲 for i, l := 0, len(s); i < l; i++ { //len(s) 返回子節數組的長度 // %2v 相應值的默認格式 fmt.Printf("%2v = %v\n", i, s[i]) //輸出單個字節值 }
遍歷字符串中的字符(使用 for range 語句訪問):code
s := "Hello 世界!" for i, v := range s { // i 是字符的字節位置,v 是字符的拷貝 fmt.Printf("%2v = %c\n", i, v) // 輸出單個字符 }
在 Go 語言中,字符串的內容是不能修改的,也就是說,你不能用 s[0] 這種方式修改字符串中的 UTF-8 編碼,若是你必定要修改,那麼你能夠將字符串的內容複製到一個可寫的緩衝區中,而後再進行修改。這樣的緩衝區通常是 []byte 或 []rune。若是要對字符串中的字節進行修改,則轉換爲 []byte 格式,若是要對字符串中的字符進行修改,則轉換爲 []rune 格式,轉換過程會自動複製數據。orm
修改字符串中的字節(用 []byte):htm
s := "Hello 世界!" b := []byte(s) // 轉換爲 []byte,自動複製數據 b[5] = ',' // 修改 []byte fmt.Printf("%s\n", s) // s 不能被修改,內容保持不變 fmt.Printf("%s\n", b) // 修改後的數據
修改字符串中的字符(用 []rune):
s := "Hello 世界!" r := []rune(s) // 轉換爲 []rune,自動複製數據 r[6] = '中' // 修改 []rune r[7] = '國' // 修改 []rune fmt.Println(s) // s 不能被修改,內容保持不變 fmt.Println(string(r)) // 轉換爲字符串,又一次複製數據
在 []byte 中處理 rune 字符(須要用到 utf8 包中的解碼函數)
b := []byte("Hello 世界!") for len(b) > 0 { r, n := utf8.DecodeRune(b) // 解碼 b 中的第一個字符 fmt.Printf("%c\n", r) // 顯示讀出的字符 b = b[n:] // 丟棄已讀取的字符 }
分割字符串
package main import ( "fmt" "strings" ) func main() { var str string = "hello world good luck" //這個函數的做用是按照1:n個空格來分割字符串最後返回的是[]string的切片 fmt.Println(strings.Fields(str)) split := func(s rune) bool { if s == 'o' { return true } return false } var str2 = "helloworld" //根據自定義函數來分割字符串 fmt.Println(strings.FieldsFunc(str2, split))//[hell w rld] var str3 string = "a,b,c,d,e" //根據分隔符來分割字符串 fmt.Println(strings.Split(str3, ",")) //[a b c d e] var str4 string = "Users,xinxingegeya,gogogo" //[Users,xinxingegeya,gogogo] //[Users xinxingegeya,gogogo] //[Users xinxingegeya gogogo] //[Users xinxingegeya gogogo] fmt.Println(strings.SplitN(str4, ",", 1)) fmt.Println(strings.SplitN(str4, ",", 2)) fmt.Println(strings.SplitN(str4, ",", 3)) fmt.Println(strings.SplitN(str4, ",", 4)) }
包含字符串
package main import ( "fmt" "strings" ) func main() { var str string = "hello 世界!!!" fmt.Println(strings.Contains(str, "世界")) //true fmt.Println(strings.Contains(str, "he")) //true fmt.Println(strings.Contains(strings.ToLower(str), strings.ToLower("HE"))) fmt.Println(strings.Index(str, "ll")) //返回子字符串第一個字符的索引位置 }
其它操做方式
https://github.com/astaxie/gopkg/tree/master/strings
參考引用:
http://www.cnblogs.com/golove/p/3284304.html
http://www.cnblogs.com/howDo/archive/2013/04/20/GoLang-String.html
=======END=======