golang2021数据格式(95)字符串和bytes切片之间的转换

是一个非常精典的例子。实现,要求是 zero-copy。想一下,一般的做法,都需要遍历字符串或 bytes 切片,再挨个赋值。

完成这个任务,我们需要了解 slice 和 string 的底层数据结构:

 1
     2
     3
     4
     5
     6
     7
     8
     9
    10

type   StringHeader struct {
            Data uintptr
            Len  int
    }

type   SliceHeader struct {
            Data uintptr
            Len  int
            Cap  int
    }

上面是反射包下的结构体,路径:src/reflect/value.go。只需要共享底层 Data 和 Len 就可以实现 zero-copy。

1
    2
    3
    4
    5
    6

func   string2bytes(s string) []byte {
            return *(*[]byte)(unsafe.Pointer(&s))
    }
    func bytes2string(b []byte) string{
            return *(*string)(unsafe.Pointer(&b))
    }

原理上是利用指针的强转,代码比较简单,不作详细解释。


golang2021数据格式(95)字符串和bytes切片之间的转换


展开阅读全文

页面更新:2024-05-11

标签:切片   字符串   遍历   赋值   数据结构   指针   底层   反射   路径   例子   做法   原理   结构   代码   简单   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top