go 迭代string数组操作 go for string[]
程序员文章站
2022-04-10 08:54:15
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(指针运算)实现转换
没有出现逃逸现象
对比一下优化前后的性能差异
没有额外开辟内存0b/op,执行效率:5亿次耗时1.6秒,而不用unsafe.pointer和uintptr转换300次耗时久达到了1.1秒,效率对比高下立判
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。