欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

go 迭代string数组操作 go for string[]

程序员文章站 2022-06-25 08:04:17
go 迭代string数组,直接拷贝去用即可补充:golang字符串string与字符数组[]byte高效转换string与[]byte的直接转换是通过底层数据copy实现的var a = []byt...

go 迭代string数组,直接拷贝去用即可

补充:golang字符串string与字符数组[]byte高效转换

string与[]byte的直接转换是通过底层数据copy实现的

var a = []byte("hello boy")

var b = string(a)

这种操作在并发量达到十万百万级别的时候会拖慢程序的处理速度

通过gdb调试来看一下string和[]byte的数据结构

转换后 [ ]byte 底层数组与原 string 内部指针并不相同,以此可确定数据被复制。那么,如不修改数据,仅转换类型,是否可避开复制,从而提升性能?

从 ptype 输出的结构来看,string 可看做 [2]uintptr,而 [ ]byte 则是 [3]uintptr,这便于我们编写代码,无需额外定义结构类型。如此,str2bytes 只需构建 [3]uintptr{ptr, len, len},而 bytes2str 更简单,直接转换指针类型,忽略掉 cap 即可。

通过unsafe.pointer(指针转换)和uintptr(指针运算)实现转换

go 迭代string数组操作 go for string[]

没有出现逃逸现象

对比一下优化前后的性能差异

go 迭代string数组操作 go for string[]

没有额外开辟内存0b/op,执行效率:5亿次耗时1.6秒,而不用unsafe.pointer和uintptr转换300次耗时久达到了1.1秒,效率对比高下立判

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。

相关标签: go 迭代 string