golang的string

x33g5p2x  于2021-11-09 转载在 Go  
字(1.3k)|赞(0)|评价(0)|浏览(317)

golang中的string是不可变的字节序列,零值是空字符串,默认是UTF-8编码。

golang中使用字符串最需要注意的是,golang中的字符串是字节序列,string == []byte,由于一个字符占用的字节数不确定,所以无法通过下标[i]的方式稳定地获取对应位置的字符。 也就意味着字符串的第i个字节,不一定就是第i个字符,原因请参考 unicode与UTF-8

文字符号在golang中被称为rune,发音为/ru:n/,意思是符号。由于utf-8最多使用4个字节来编码,所以rune类型是int32的别名。

由于字符串是不可变的,所以两个字面值相等的字符串可以共用一段底层内存,子串也无需重新分配内存。

常用操作

字节序列的长度 / 字符串长度

s :=  "hello, 世界"
len(s) 									// 13
utf8.RuneCountInString(s)			// 9

字节子串 / 字符串子串

s := "hello,世界"
s[0:3] //	字节子串,前含后不含

runes := []rune(s) 		// 现在的runes才是事实上的字符数组了,只不过它体现为4个字节的数字
runes[7:9] 				// 字符的子串,"世界",只是看着不对,因为被编码为数字了
string(runes[7:9]) 	// 现在看着对了

如果字符串的下标越界的话,将触发宕机异常。

字符串拼接

"abc" + "xyz"

多行文本

json := `
    foo:
bar \n
`

多行文本中的转义字符不转义。

字符串遍历

最老式的遍历

for i := 0; i < len(str); {
	//currentRune 就是当前的字符,size是当前字符占用几个字节
    currentRune, size := utf8.DecodeRuneInString(str[i:]) 
	// 通过string(myRune) 的形式转换为字符串显示
    fmt.Print(string(currentRune))  	
	// 或通过 %c 输出字符串显示
    fmt.Printf("%c", currentRune)     
    i += size
}

range会按照utf-8隐式解码,就像循环调用了utf8.DecodeRuneInString一样,使用比较简单

// range 的第二个参数是当前的rune,第一个参数是rune在字节序列中的索引
for _, r := range str {			
    fmt.Print(string(r))
}

string 与 int之间的转换

字符串转换成数字

Atoi (ASCII to Integer)
Itoa(Integer to ASCII)

str := "123"
if num, err := strconv.Atoi(str); err == nil {
    fmt.Println(num)
}

数字转换成字符串,两种形式

num := 123
str2 := strconv.Itoa(num)			// 形式1

str3 := fmt.Sprintf("%d", num)		// 形式2

相关文章

微信公众号

最新文章

更多