golang 如何通過unsafe.Pointer uintptr來實現string與byte互轉

主要是對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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章