Go 的 strings 包定义了一个 Builder 类型,它有一个 String() 方法
func (b *Builder) String() string {
return *(*string)(unsafe.Pointer(&b.buf))
}
正如 reflect pacakge 所指出的,一个字节切片被定义为一个 SliceHeader 和一个由 header 的 Data 字段指向的关联数据块:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
并且 string 被定义为一个 StringHeader 和一个由 header 的 Data 字段指向的关联数据块
type StringHeader struct {
Data uintptr
Len int
}
SliceHeader 有 3 个字段(Data、Len 和 Cap),而 StringHeader 只有 2 个(Data 和 Len),那么如何直接将字节切片转换为字符串呢?
*(*string)(unsafe.Pointer(&buf))
据我了解,我们应该编写以下代码:
func byte2str(b []byte) string {
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
return *(*string)(unsafe.Pointer(&reflect.StringHeader{Data: hdr.Data, Len: hdr.Len}))
}
翻阅古今
相关分类