主要是對unsafe.Pointer uintptr的一個應用實例,順便了解golang的string與slice底層是怎樣實現的
func Str2bytes(s string) []byte {
x := (*[2]uintptr)(unsafe.Pointer(&s))
h := [3]uintptr{x[0], x[1], x[1]}
return *(*[]byte)(unsafe.Pointer(&h))
}
func Bytes2str(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
Str2bytes
:方法代碼解釋
// 如果瞭解string底層實現,就明白了。string底層其它就是一個結構體
// string 底層實現
type stringStruct struct {
str unsafe.Pointer
len int
}
x := (*[2]uintptr)(unsafe.Pointer(&s)) //返回的是string的struct信息,x[0]:是s的首指針[對應對應底層str],x[1]:對應字符串的長度[對應底層len]
// 再來看下slice的底層實現
type slice struct {
array unsafe.Pointer
len int
cap int
}
// 結合slice底層,下面這句代碼就明白了吧
h := [3]uintptr{x[0], x[1], x[1]} // unsafe.Pointer轉換後,x[0]對應array指針,x[1]對應len,x[2]:對應cap