转载

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操作未导出变量

原文  http://shanks.leanote.com/post/Go性能优化技巧【转】
正文到此结束
Loading...