是一個非常精典的例子。實現,要求是 zero-copy。想一下,一般的做法,都需要遍歷字串或 bytes 切片,再挨個賦值。
完成這個任務,我們需要了解 slice 和 string 的底層資料結構:
1 2 3 4 5 6 7 8 9 10 |
type StringHeader struct { Data uintptr Len int } type SliceHeader struct { Data uintptr Len int Cap int } |
上面是反射包下的結構體,路徑:src/reflect/value.go。只需要共享底層 Data 和 Len 就可以實現 zero-copy。
1 2 3 4 5 6 |
func string2bytes(s string) []byte { return *(*[]byte)(unsafe.Pointer(&s)) } func bytes2string(b []byte) string{ return *(*string)(unsafe.Pointer(&b)) } |
原理上是利用指標的強轉,程式碼比較簡單,不作詳細解釋。
最新評論