go学习笔记(12)字符串、符文、字节

IMG_6156.jpg

在了解了切片(slice)后我们再回过头来看看字符串的切片操作。

字符串(string)的底层是一系列字节(byte),这些字节没有默认的编码,但go语言中的for range循环以及很多库函数会默认字符串是以UTF-8编码的。

可以通过[]来获取字符串指定索引处的字节值。

1
2
3
4
var a string = "Hello World!"
var b byte = a[6]
fmt.Printf("integer: %v\n", b)
fmt.Printf("character: %c\n", b)

输出:

1
2
integer: 87
character: W

byte默认的输出形式是数值,如果想以字符的形式显示要用%c

可以对字符串进行切片操作。

1
2
3
4
5
s := "Hello World"
s1 := s[0:5]
s2 := s[6:11]
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)

输出:

1
2
s1: Hello
s2: World

s1,s2都是从字符串s中通过切片操作得到的子字符串。字符串是不可变的,所以不用担心它们是不是共享底层存储的问题。

当我们的字符串包含非英文字符时,非英文字符会采用多字节的形式进行编码,我们就不能再直接通过索引获取相关的字符了。

如果想得到一个字符串的字节数可以采用内置的len函数,对于含有非英文字符的字符串,如果想知道字符个数的话,用len会得到错误的结果。

1
2
s := "Hello 你好"
fmt.Println(len(s))

输出:

1
12

这里,“你好“中的每个字符占用3个字节。

单个的runebyte可以转换成string

1
2
3
4
5
6
var r rune = '你'
var s1 string = string(r)
var b byte = 'h'
var s2 string = string(b)
fmt.Println("s1:", s1)
fmt.Println("s2:", s2)

输出:

1
2
s1: 你
s2: h

string也可以转换成[]byte[]rune

1
2
3
4
5
s := "Hello 你好"
var bs []byte = []byte(s)
var rs []rune = []rune(s)
fmt.Println(bs)
fmt.Println(rs)

输出:

1
2
[72 101 108 108 111 32 228 189 160 229 165 189]
[72 101 108 108 111 32 20320 22909]

可以看到转换成[]byte后,“你好”是由6个字节构成的。而转换成[]rune,后“你好”对应两个rune

江达小记