文章主要是参考 雨痕学堂(微信订阅号) 及其他网友的博客然后根据自己的理解整理而成。
在写程序的过程中经常遇到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操作未导出变量