golang面試題:字符串轉成byte數組,會發生內存拷貝嗎?

問題

字符串轉成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

相關文章
相關標籤/搜索