## 問題
字符串轉成 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包的內存泄漏