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

问题

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

怎么答

字符串转成切片,会产生拷贝。严格来说,只要是发生类型强转都会发生内存拷贝。那么问题来了。

频繁的内存拷贝操作听起来对性能不大友好。有没有什么办法可以在字符串转成切片的时候不用发生拷贝呢?

代码实现

go 复制代码
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的底层结构。
go 复制代码
type StringHeader struct {
 Data uintptr
 Len  int
}
  • SliceHeader 是切片在go的底层结构。
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.再通过 *转为指针指向的实际内容。

相关推荐
weixin_440730503 分钟前
python+request实现接口-小结
开发语言·python
不能放弃治疗5 分钟前
上下文压缩机制
后端
QQ_21696290968 分钟前
【项目编号:project95315】SpringBoot公共自习室管理系统:座位预约、房间管理、签到核销、公告规则完整实战
java·spring boot·后端
凤山老林13 分钟前
高可用服务容错架构:Spring Boot 集成 Resilience4j 实战指南
spring boot·后端·架构·resilience4j
xcLeigh14 分钟前
Go入门:基本数据类型全览与选择指南
android·服务器·golang·教程·go热门
ZJU_统一阿萨姆27 分钟前
【算子开发】扫描(Scan)与前缀和
开发语言·arm开发·架构·系统架构·硬件架构
-凌凌漆-28 分钟前
【C语言】结构体typedef struct与struct的区别
c语言·开发语言
手握风云-29 分钟前
Spring Cloud:分布式系统的“粘合剂”(五)
后端·spring·spring cloud
早点睡97531 分钟前
Python 上下文管理器深度剖析:从 with 语法糖到 CPython 底层协议
后端·面试
Cache技术分享33 分钟前
503. Java 反射 - 编写 ServiceFactory 类
前端·后端