当前位置: 首页 > article >正文

golang面试题:字符串转成byte数组,会发生内存拷贝吗?

问题

字符串转成byte数组,会发生内存拷贝吗?

怎么答

字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。
频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢?

代码实现

package main

import (
 "fmt"
 "reflect"
 "unsafe"
)

func main() {
 a :="aaa"
 ssh := *(*reflect.StringHeader)(unsafe.Pointer(&a))
 b := *(*[]byte)(unsafe.Pointer(&ssh))  
 fmt.Printf("%v",b)
}

解释

  • StringHeader 是字符串在go的底层结构。
type StringHeader struct {
 Data uintptr
 Len  int
}


  • SliceHeader 是切片在go的底层结构。
type SliceHeader struct {
 Data uintptr
 Len  int
 Cap  int
}


  • 那么如果想要在底层转换二者,只需要把 StringHeader 的地址强转成 SliceHeader 就行。那么go有个很强的包叫
    unsafe 。
  1. unsafe.Pointer(&a)方法可以得到变量a的地址。
  2. (reflect.StringHeader)(unsafe.Pointer(&a)) 可以把字符串a转成底层结构的形式。
  3. ([]byte)(unsafe.Pointer(&ssh)) 可以把ssh底层结构体转成byte的切片的指针。
  4. 再通过 *转为指针指向的实际内容。

http://www.kler.cn/a/151965.html

相关文章:

  • C++:OJ练习(每日练习系列)
  • RK3568 android11 实现双路I2C触摸 --GT9xx
  • exceljs读取el-upload上传的excle数据并转为json输出
  • ES6数据解构
  • uniapp IOS从打包到上架流程(详细简单)
  • 阿里云服务器部署node和npm
  • ZC-OFDM模糊函数原理及仿真
  • Android查看当前机器的ABI类型
  • Java中的JMX的使用
  • 常用的设计模式
  • 【docker系列】docker实战之部署SpringBoot项目
  • 互联网计算机 IC 生态发展大揭秘,DFINITY 官方扶持计划全公开!
  • 【驱动】SPI驱动分析(三)-SPI关键数据类型
  • C语言--不创建第三个变量,实现对两个数字的交换
  • springboot使用定时任务
  • 不是默认进入Linux|总是自动进入windows系统
  • conda环境下,安装所有包都报错:No module named ‘certifi‘
  • ICC2:使用analyze_lib_cell_placement检查lib cell的pass rate
  • 游戏开发团队配置与协作流程
  • 智能优化算法应用:基于旗鱼算法无线传感器网络(WSN)覆盖优化 - 附代码