Go性能优化技巧

文章主要是参考 雨痕学堂(微信订阅号)
及其他网友的博客然后根据自己的理解整理而成。

string与[]byte相互转换

在写程序的过程中经常遇到string与[]byte的相互转换,但是这种转换是有代价的,string与[]byte并不共享底层内存空间,所以每次转换都伴随着内存的分配与底层字节的拷贝。 我们可以借助unsafe完成指针类型转换,避开内存分配与复制,从而提升性能。 属于黑魔法,尽量不要用。
“`go / struct string{ uint8
str; int len; }

struct []uint8{ uint8 *array; int len; int cap; } uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它和unsafe.Pointer可相互转换。

但是转换后的string与[]byte共享底层空间,如果修改了[]byte那么string的值也会改变,就违背了string应该是只读的规范了,可能会造成难以预期的影响。 */

func str2byte(s string) []byte { x := ( [2]uintptr)unsafe.Pointer(&s) h := [3]uintptr{x[0],x[1],x[1]} return
(*[]byte)(unsafe.Pointer(&h)) }

func byte2str(b []byte) string{ return (
string)(unsafe.Pointer(&b)) } “`

参考文献

雨痕学堂(微信订阅号) Go高性能编程技巧
golang: 利用unsafe操作未导出变量

稿源:shanks's Blog (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合编程 » Go性能优化技巧

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录