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()
}