这篇文章将为大家详细讲解有关golang中字符串和[]字节的对比示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
<强> golang字符串和[]字节的对比强>
为啥字符串和[]字节类型转换需要一定的代价?
为啥内置函数复制会有一种特殊情况<代码>复制(dst[]字节,src字符串)int> 代码?
字符串和[]字节,底层都是数组,但为什么[]字节字符串比灵活,拼接性能也更高(动态字符串拼接性能对比)?
今天看了源码探究了一下。
以下所有观点都是个人愚见,有不同建议或补充的的欢迎emial我aboutme
<强>何为字符串? 强>
什么是字符串?标准库装入的<代码> 代码>的解释:
type 字符串 string is 从而set of  all strings of 8-bit 字节,,conventionally but not necessarily representing UTF-8-encoded 文本只A string may be 空,,but not 零只Values of string type 断开连接;不可改变的。
简单的来说字符串是一系列8位字节的集合,通常但不一定代表utf - 8编码的文本。字符串可以为空,但不能为零。而且字符串的值是不能改变的。
不同的语言字符串有不同的实现,在去的源码中<代码> src/运行/string.go> 代码,字符串的定义如下:
type stringStruct struct { ,,,str unsafe.Pointer ,,,len int}
可以看到str其实是个指针,指向某个数组的首地址,另一个字段是len长度。那到这个数组是什么呢?在实例化这个stringStruct的时候:
func gostringnocopy (str *字节),string { ss :=, stringStruct {str: unsafe.Pointer (str), len:, findnull (str)} s :=, *(*字符串)(unsafe.Pointer(和ss)) return s }
哈哈,其实就是字节数组,而且要注意字符串其实就是个struct。
何为[]字节?
首先在去里面,字节是uint8的别名。而切结构在去的源码中<代码> src/运行/slice.go 代码>定义:
type slice struct {array unsafe.Pointer len , int cap ,, int}
数组是数组的指针,len表示长度,帽表示容量。除了帽,其他看起来和字符串的结构很像。
但其实他们差别真的很大。
其实[]字节和字符串的差别是更改变量的时候数组的内容可以被更改。
s :=,[]字节{1},//,分配存储1数组的内存空间,年代结构体的数组指针指向这个数组.s =,[]字节{2},,//,将数组的内容改为2
因为字符串的指针指向的内容是不可以更改的,所以每更改一次字符串,就得重新分配一次内存,之前分配空间的还得由gc回收,这是导致字符串操作低效的根本原因。