163 字
1 分钟
如何实现字符串和byte切片的零拷贝转换 - unsafe
这是一个非常精典的例子。实现字符串和 bytes 切片之间的转换,要求是 zero-copy。想一下,一般的做法,都需要遍历字符串或 bytes 切片,再挨个赋值。
完成这个任务,我们需要了解 slice 和 string 的底层数据结构:
type StringHeader struct { Data uintptr Len int}
type SliceHeader struct { Data uintptr Len int Cap int}上面是反射包下的结构体,路径:src/reflect/value.go。只需要共享底层 Data 和 Len 就可以实现 zero-copy。
func string2bytes(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s))}func bytes2string(b []byte) string{ return *(*string)(unsafe.Pointer(&b))}原理上是利用指针的强转,代码比较简单,不作详细解释。
如何实现字符串和byte切片的零拷贝转换 - unsafe
https://blog.zhequtao.com/posts/golang/go-new/gobook/go-questions/标准库/unsafe/如何实现字符串和byte切片的零拷贝转换/ 相关阅读
本主题其他内容
Go 基础与进阶
本主题共 120 篇 ·
Go 语言 专题 →
Go 语言从入门到进阶:基础语法与工程惯例、标准库常用包、错误处理与并发模式、Web 开发与微服务框架入门,帮助新手建立可持续演进的 Go 代码习惯。