golang中字符串和[]字节的对比示例

  介绍

这篇文章将为大家详细讲解有关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回收,这是导致字符串操作低效的根本原因。

golang中字符串和[]字节的对比示例