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))
}
字符串转换成数字
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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/daguanjia11/article/details/121236242
内容来源于网络,如有侵权,请联系作者删除!