Go字符串 && strings包

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:]                  // 丟棄已讀取的字符
}

strings包的字符串處理函數

分割字符串

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=======

相關文章
相關標籤/搜索