Go奇技淫巧

string的本質(zhì):reflect.StringHeader{}
slice的本質(zhì):reflect.SliceHeader{}
go指針的本質(zhì):unsafe.Pointer{}、uintptr{}

獲取slice和string的內(nèi)存地址####

func stringPointer(s string) unsafe.Pointer {
  // string的指針本質(zhì)是*reflect.StringHeader
  p := (*reflect.StringHeader)(unsafe.Pointer(&s))
  return unsafe.Pointer(p.Data)
}

func bytePointer(b []byte) unsafe.Pointer {
   // slice的指針本質(zhì)是*reflect.SliceHeader
  p := (*reflect.SliceHeader)(unsafe.Pointer(&b))
  return unsafe.Pointer(p.Data)
}```

####把[]byte轉(zhuǎn)成string####
類型轉(zhuǎn)換:string(b),為了穩(wěn)定性Go內(nèi)部進(jìn)行了數(shù)據(jù)復(fù)制。
為了獲的更好的性能,我們可以這樣:

func byteString(b []byte) string {
// reflect.StringHeader和reflect.SliceHeader的結(jié)構(gòu)體相似
return (string)(unsafe.Pointer(&b))
}```

結(jié)構(gòu)體和[]byte互轉(zhuǎn)####







type MyStruct struct {
    A int
    B int
}

var sizeOfMyStruct = int(unsafe.Sizeof(MyStruct{}))

func MyStructToBytes(s *MyStruct) []byte {
    var x reflect.SliceHeader
    x.Len = sizeOfMyStruct
    x.Cap = sizeOfMyStruct
    x.Data = uintptr(unsafe.Pointer(s))
    return *(*[]byte)(unsafe.Pointer(&x))
}

func BytesToMyStruct(b []byte) *MyStruct {
    return (*MyStruct)(unsafe.Pointer(
        (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data,
    ))
}```
這種方式同樣也適用于string與[]byte互轉(zhuǎn):

var sizeOfString = int(unsafe.Sizeof(""))

func StringtToBytes(s *string) []byte {
var x reflect.SliceHeader
x.Len = sizeOfMyStruct
x.Cap = sizeOfMyStruct
x.Data = uintptr(unsafe.Pointer(s))
return ([]byte)(unsafe.Pointer(&x))
}

func BytesToString(b []byte) string{
return (string)(unsafe.Pointer(
(*reflect.SliceHeader)(unsafe.Pointer(&b)).Data,
))
}```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容