golang无复制高效实现string与[]byte转换

2025-05-23 10:46:38

1、写一个字符串string和字节数组[]byte相互转换的demo,该demo很简单、容易理解;注意最后一行的赋值语句仅仅是为了避免编译错误哦,如果没这句编译时将报未使用变量b的编译错误。

golang无复制高效实现string与[]byte转换

2、编译程序:go build -gcflags "-m -l -N",其中-l -N禁止了一切优化;编译成功后用gdb加载弛贾班隧程序查看string和[]byte的数据结构;这里如果不熟悉gdb的指令请查找相关资料充电。

golang无复制高效实现string与[]byte转换

3、转换后 [ ]byte 底层数组与原 string 内部指针并不相同(前者为0xc4200猱蝰逾鸾57f30后者为0旌忭檀挢x469ca8),以此可确定数据被复制。ptype的输出可以知道前者的底层数据结构比后者只是多了一个cap字段,前者可以看作[3]uintptr{ptr, len, len},后者可以看作[2]uintptr,可以利用unsafe.Pointer来在编译期做转换。

golang无复制高效实现string与[]byte转换

4、参考步骤2,用gdb加载程序查看s、s2、b变量底层数据结构里指针的值,看看是否都一样;结果显示是一样的。

golang无复制高效实现string与[]byte转换

5、测试转换在启用优化时结果是正确的。尽管从步骤4可以推断转换是没问题的,但因为步骤4编译时禁用了优化可能会与实际不一致。

golang无复制高效实现string与[]byte转换
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢