[转]golang面试 - Rune与Byte的区别

以下文章转自 https://iswbm.com/517.html 一个字符串是由若干个字符组合而成的,比如 hello,就由 5 个字符组成。 在 Go 中字符类型有两种,分别是: byte 类型:字节,是 uint8 的别名类型 rune 类型:字符,是 int32 的别名类型 byte 和 rune ,虽然都能表示一个字符,但 byte 只能表示 ASCII 码表中的一个字符(ASCII 码表总共有 256 个字符),数量远远不如 rune 多。 rune 表示的是 Unicode字符中的任一字符,而我们都知道,Unicode 是一个可以表示世界范围内的绝大部分字符的编码, 这张表里几乎包含了全世界的所有的字符,当然中文也不在话下。 能表示的字符更多,意味着它占用的空间,也要更大,所占空间是 4个 byte 的大小。 下面以一段代码来验证一下他们的占用空间的差异 1 2 3 4 5 6 7 8 var a byte = 'A' var b rune = 'B' fmt.Printf("a 占用 %d 个字节数\n", unsafe.Sizeof(a)) fmt.Printf("b 占用 %d 个字节数\n",unsafe.Sizeof(b)) // output a 占用 1 个字节数 b 占用 4 个字节数 参考文档: https://iswbm....

十一月 4, 2022 · nobject

golang面试 - string与[]byte的区别,如何互相转化

string是一个8位字节的集合,通常但不一定代表UTF-8编码的文本。string可以为空,但是不能为nil。string的值是不能改变的。string类型本质也是一个结构体,底层本质就是一个byte类型的数组。 byte就是uint8的别名,它是用来区分字节值和8位无符号整数值 string与[]byte的区别 对于[]byte与string而言,两者之间最大的区别就是string的值不能改变。string在底层都是结构体stringStruct{str: str_point, len: str_len},string结构体的str指针指向的是一个字符常量的地址, 这个地址里面的内容是不可以被改变的,因为它是只读的,但是这个指针可以指向不同的地址。 string的好处:以在不加锁的控制下,多次使用同一字符串,在保证高效共享的情况下而不用担心安全问题 对于[]byte来说,以下操作是可行的: 1 2 b := []byte("hello world") b[1] = 'i' string修改操作是被禁止的: 1 2 s := "hello world" s[1] = 'i' string支持这样的操作: 1 2 s := "hello world" s = "iello world" string与[]byte的互相转化 string的底层数据结构类型: 1 2 3 4 type stringStruct struct { str unsafe.Pointer len int } []byte对应的底层数据结构(本质上是个slice): 1 2 3 4 5 type slice struct { array unsafe.Pointer len int cap int } 两者对应的结构非常相似。...

十一月 4, 2022 · nobject