golang语言渐入佳境[21]-string类型详解
string的本质
string是一个引用类型,string包含了两个部分。一个部分是指针,指向了底层的一个字节数组。另一个部分是字节数组的长度。
当复制字符串时,也只是复制了指针与长度。底层的那个字节数组是不能够改变的。
字符串使用UTF-8编码。
打印字符串
1 2 3 4 5
| func main(){
str := "跟着建勋老师学编程" fmt.Println([]byte(str)) // 转换为字节数组 }
|
转换为字节数组
1 2 3 4
| func main(){ str := "跟着建勋老师学编程" fmt.Println([]byte(str)) }
|
字符串中特殊字符
1 2 3 4 5 6 7 8 9 10
| \a U+0007 alert or bell \b U+0008 backspace \f U+000C form feed \n U+000A line feed or newline \r U+000D carriage return \t U+0009 horizontal tab \v U+000b vertical tab \\ U+005c backslash \' U+0027 single quote (valid escape only within rune literals) \" U+0022 double quote (valid escape only within string literals)
|
字符串长度len
1 2 3 4
| func main(){ str := "跟着建勋老师学编程" fmt.Println(len(str)) //27 总的字节个数 }
|
字符串序号
1 2 3 4
| func main(){ str := "跟着建勋老师学编程" fmt.Println(str[20]) //仍然是字节 }
|
字符串slice
截断无压力
1 2 3 4
| func main(){ str := "跟着建勋老师学编程" fmt.Println(str[3:]) //打印出:着建勋老师学编程 }
|
字符串+连接
1 2 3 4 5
| func main(){ str1 := "jonson love " str2 :="olaya" fmt.Println(str1+str2) //jonson love olaya }
|
Rune打印字符串
Rune为4个字节,存储国际版的字符
1 2 3 4 5 6 7 8 9 10
| package main
import "fmt"
func main() { str:="i love 建勋老师" for i,ch:= range str{ fmt.Printf(" (%d %x) ",i,ch) } }
|
输出结果为:(0 69) (1 20) (2 6c) (3 6f) (4 76) (5 65) (6 20) (7 5efa) (10 52cb) (13 8001) (16 5e08)
每一个中文在底层占了3个字节,range str 时 前面的序号为所在字符的首字节位置。
循环每个字符:
1 2 3 4 5 6 7 8 9 10 11
| package main
import "fmt"
func main() { str:="i love 建勋老师" for i,ch:= range []rune(str){ fmt.Printf(" (%d %c) ",i,ch) } }
|
UTF8包中有不少方法,如utf8.DecodeRune为读取一个Rune以及其字节大小,案例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package main
import ( "fmt" "unicode/utf8" )
func main() { str:="i love 建勋老师" bytes:= []byte(str) for len(bytes) >0{ ch,size:= utf8.DecodeRune(bytes) bytes=bytes[size:] fmt.Printf("%c",ch) } fmt.Println() }
|
灾难总是接踵而至,这正是世间的常理。你以为只要哭诉一下,就会有谁来救你?如果失败了,就只能说明我不过是如此程度的男人