Go语言阅读小笔记,来自知呼达达关于unsafe.POinter的分享.

第一式 – 获得Slice和String的内存数据

<span style="font-size:18px;">func stringPointer(s string) unsafe.Pointer {p := (*reflect.StringHeader)(unsafe.Pointer(&s))return unsafe.Pointer(p.Data)}func bytePointer(b []byte) unsafe.Pointer {p := (*reflect.SliceHeader)(unsafe.Pointer(&b))return unsafe.Pointer(p.Data)}</span>

第二式 – 把[]byte转成stringpackage labs28import "testing"import "unsafe"func Test_ByteString(t *testing.T) {var x = []byte("Hello World!")var y = *(*string)(unsafe.Pointer(&x))var z = string(x)if y != z {t.Fail()}}func Benchmark_Normal(b *testing.B) {var x = []byte("Hello World!")for i := 0; i < b.N; i ++ {_ = string(x)}}func Benchmark_ByteString(b *testing.B) {var x = []byte("Hello World!")for i := 0; i < b.N; i ++ {_ = *(*string)(unsafe.Pointer(&x))}}这个实验先证明了我们可以用[]byte的数据造个string给Go。接着做了两组Benchmark,分别测试了普通的类型转换和伪造string的效率。

PASSBenchmark_Normal 2000000063.4 ns/opBenchmark_ByteString 20000000000.55 ns/opokgithub.com/idada/go-labs/labs28 2.486s

第三式 – 结构体和[]byte互转type MyStruct struct {A intB int}var sizeOfMyStruct = int(unsafe.Sizeof(MyStruct{}))func MyStructToBytes(s *MyStruct) []byte {var x reflect.SliceHeaderx.Len = sizeOfMyStructx.Cap = sizeOfMyStructx.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,))}

版权声明:本文为博主原创文章,,未经博主允许不得转载。

志在山顶的人,不会贪念山腰的风景。

Go语言阅读小笔记,来自知呼达达关于unsafe.POinter的分享.

相关文章:

你感兴趣的文章:

标签云: