字符串轉成byte數組,會發生內存拷貝嗎?golang
字符串轉成切片,會產生拷貝。嚴格來講,只要是發生類型強轉都會發生內存拷貝。那麼問題來了。
頻繁的內存拷貝操做聽起來對性能不大友好。有沒有什麼辦法能夠在字符串轉成切片的時候不用發生拷貝呢?web
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轉成底層結構的形式。ssh
3.(*[]byte)(unsafe.Pointer(&ssh))
能夠把ssh底層結構體轉成byte的切片的指針。編輯器
4.再經過 *
轉爲指針指向的實際內容。性能
若是喜歡個人文章,可關注個人公衆號:golang小白成長記ui