在上述文章中,我们学过了字符串类型。
在Go语言中,字符串类型是基本类型,在栈中存储,其结构如下。
可以看到,在Go中,字符串其实就是指向了一个连续的内存地址,并且记录了长度,读取是一次性读取出来的。
那么,如上图所示,内存里面存的一个个字母叫啥呢???
字符串是一个个字符拼接成的,反过来,也是一个个字符拼接成的字符串,而一个个的字符,就被称为字节(byte)。
字节占用1个字节大小,只能存字母了,标点符号之类的,不能存中文。
当然,存中文怎么办???在Go中有一个rune
,和byte
类似,本质和byte
一样,只不过rune
一个占用4个字节。
rune
使用utf-8
编码,可以存中文,各种语言。
所以,处理中文尽量用rune
类型。
字符用单引号'
号包裹起来。
代码
package main import "fmt" func main() { var a byte = 'a' fmt.Println(a) }
原因
byte
代表的是一个ASCII
码的一个字符,同理,rune
可以理解为是byte
的一个超集,向下兼容byte
。
package main import "fmt" func main() { var a rune = 'a' fmt.Println(a) }
结果:
但是rune
里面可以写中文,byte
不行。
发现了吗,打印的竟然是一个数字?这是为啥???
就拿字母a
来说,其实打印的是ASCII
对应的数字,打印的是他的十进制。
同理,字符张
也是,这里就不做例子了,因为utf-8
表太大了。
package main import "fmt" func main() { s := "我是法外狂徒,张三,hahaha" for _, r := range s { fmt.Printf("%c \n",r) } }
package main import "fmt" func main() { s := "我是法外狂徒,张三,hahaha" for i := 0; i < len(s); i++ { //中文会乱码,不推荐 fmt.Printf("%c \n",s[i]) } }
同理,字符串相当于是字节列表组成的,是不能直接修改的,想要直接修改需要打散成字节列表才行。
package main import "fmt" func main() { //只有英文的情况下 s1 := "hello world" var s1_byte_list = []byte(s1) //打散成字符列表 s1_byte_list[6] = 'F' //修改下表为6的字符为F s1 = string(s1_byte_list) //打散的字符列表在组装成字符串 fmt.Println(s1) //输出 hello 6orld //带有中文的情况 s2 := "天空好像下雨,我好像住你隔壁vay" var s2_rune_list = []rune(s2) //打散成utf-8字符列表 s2_rune_list[5] = '雪' //修改下表为5的字符为雪 s2 = string(s2_rune_list) //打散的utf8字符转字符串 fmt.Println(s2) //输出 天空好像下雪,我好像住你隔壁 }
以上是一篇文章带你了解Go语言基础之字节类型的详细内容。更多信息请关注PHP中文网其他相关文章!