## 问题
字符串转成 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. 再通过`*`转为指针指向的实际内容。
- Golnag常见面试题目解析
- 交替打印数组和字母
- 判断字符串中字符是否全都不同
- 翻转字符串
- 判断两个给定的字符串排序后是否一致
- 字符串替换问题
- 机器人坐标计算
- 语法题目一
- 语法题目二
- goroutine和channel使用一
- 实现阻塞读的并发安全Map
- 定时与 panic 恢复
- 高并发下的锁与map读写问题
- 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
- 七道语法找错题目
- golang 并发题目测试
- 记一道字节跳动的算法面试题
- 多协程查询切片问题
- 对已经关闭的的chan进行读写,会怎么样?为什么?
- 简单聊聊内存逃逸?
- 字符串转成byte数组,会发生内存拷贝吗?
- http包的内存泄漏