一篇文章带你了解Go语言基础之字节类型

HELLOBOY 2020-10-23

一篇文章带你了解Go语言基础之字节类型

 前言
Hey,大家好呀,我是星期八,这次咱们继续学习Go基础之字节类型吧。

上文之字符串回顾
在上述文章中,我们学过了字符串类型。

在Go语言中,字符串类型是基本类型,在栈中存储,其结构如下。

一篇文章带你了解Go语言基础之字节类型

可以看到,在Go中,字符串其实就是指向了一个连续的内存地址,并且记录了长度,读取是一次性读取出来的。

那么,如上图所示,内存里面存的一个个字母叫啥呢???

byte和rune类型
字符串是一个个字符拼接成的,反过来,也是一个个字符拼接成的字符串,而一个个的字符,就被称为字节(byte)。

字节占用1个字节大小,只能存字母了,标点符号之类的,不能存中文。

当然,存中文怎么办???在Go中有一个rune,和byte类似,本质和byte一样,只不过rune一个占用4个字节。

rune使用utf-8编码,可以存中文,各种语言。

所以,处理中文尽量用rune类型。

定义个(字节)byte类型变量
字符用单引号'号包裹起来。

代码

package main 
 
import "fmt" 
 
func main() { 
    var a byte = 'a' 
    fmt.Println(a) 
} 

小朋友,是否有很多疑问???为什么是97

一篇文章带你了解Go语言基础之字节类型

原因

byte代表的是一个ASCII码的一个字符,同理,rune可以理解为是byte的一个超集,向下兼容byte。

package main 
 
import "fmt" 
 
func main() { 
    var a rune = 'a' 
    fmt.Println(a) 
} 

结果:

一篇文章带你了解Go语言基础之字节类型

但是rune里面可以写中文,byte不行。

byte不能存中文

一篇文章带你了解Go语言基础之字节类型

rune可以存中文

一篇文章带你了解Go语言基础之字节类型

发现了吗,打印的竟然是一个数字?这是为啥???

就拿字母a来说,其实打印的是ASCII对应的数字,打印的是他的十进制。

同理,字符张也是,这里就不做例子了,因为utf-8表太大了。

一篇文章带你了解Go语言基础之字节类型

遍历字符串
方式一

package main 
 
import "fmt" 
 
func main() { 
    s := "我是法外狂徒,张三,hahaha" 
    for _, r := range s { 
        fmt.Printf("%c \n",r) 
} 
} 

一篇文章带你了解Go语言基础之字节类型

方式二

package main 
 
import "fmt" 
 
func main() { 
    s := "我是法外狂徒,张三,hahaha" 
    for i := 0; i < len(s); i++ { 
        //中文会乱码,不推荐 
        fmt.Printf("%c \n",s[i]) 
} 
} 

一篇文章带你了解Go语言基础之字节类型

修改字符串
同理,字符串相当于是字节列表组成的,是不能直接修改的,想要直接修改需要打散成字节列表才行。

相关推荐