go学习笔记(12)字符串、符文、字节
在了解了切片(slice)后我们再回过头来看看字符串的切片操作。
字符串(string)的底层是一系列字节(byte),这些字节没有默认的编码,但go语言中的for range循环以及很多库函数会默认字符串是以UTF-8编码的。
可以通过[]
来获取字符串指定索引处的字节值。
1 | var a string = "Hello World!" |
输出:
1 | integer: 87 |
byte
默认的输出形式是数值,如果想以字符的形式显示要用%c
。
可以对字符串进行切片操作。
1 | s := "Hello World" |
输出:
1 | s1: Hello |
s1,s2都是从字符串s中通过切片操作得到的子字符串。字符串是不可变的,所以不用担心它们是不是共享底层存储的问题。
当我们的字符串包含非英文字符时,非英文字符会采用多字节的形式进行编码,我们就不能再直接通过索引获取相关的字符了。
如果想得到一个字符串的字节数可以采用内置的len
函数,对于含有非英文字符的字符串,如果想知道字符个数的话,用len
会得到错误的结果。
1 | s := "Hello 你好" |
输出:
1 | 12 |
这里,“你好“中的每个字符占用3个字节。
单个的rune
或byte
可以转换成string
:
1 | var r rune = '你' |
输出:
1 | s1: 你 |
string
也可以转换成[]byte
及[]rune
1 | s := "Hello 你好" |
输出:
1 | [72 101 108 108 111 32 228 189 160 229 165 189] |
可以看到转换成[]byte
后,“你好”是由6个字节构成的。而转换成[]rune
,后“你好”对应两个rune
。