Go性能优化技巧

综合编程 2016-04-28

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

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

责编内容by:shanks's Blog (源链)。感谢您的支持!

您可能感兴趣的

记一次golang中sync.Map并发创建、读取的问题... 背景: 我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射。 问题 ...
iOS下的图片处理与性能优化 移动开发中我们经常和多媒体数据打交道,对这些数据的解析往往需要耗费大量资源,属于常见的性能瓶颈。 本文针对多媒体数据的一种———图片,介绍下图片的常见...
glot is a plotting library for Golang built on top... Glot glot is a plotting library for Golang built on top of gnuplot . glot cur...
gosearch – awesome-go package explorer gosearch: The awesome package explorer for Golang gosearch turns the a...
【golang-GUI开发】项目的编译 在上一篇文章里,我们讲到了安装therecipe/qt(https://www.cnblogs.com/apocelipes/p/9296754.html),现...