内容简介:常规的Go代码是可以跨平台的,因为常规代码只关心使用哪种数据结构,而不关心数据结构的内部实现,内部实现细节由编译器处理。而
常规的 Go 代码是可以跨平台的,因为常规代码只关心使用哪种数据结构,而不关心数据结构的内部实现,内部实现细节由编译器处理。
而 unsafe
这个包就是用来访问内部实现细节的。所以,使用了unsafe这个包的代码,因为Go的编译器实现细节改变,很有可能会造成兼容性问题。
三个函数
unsafe
主要提供了三个函数:
Alignof Offsetof Sizeof
看示例:
package main
import (
"fmt"
"unsafe"
)
type Demo struct {
s string
i int
f float64
bs []byte
}
func main() {
d := Demo{}
fmt.Println("Alignof:")
fmt.Println(unsafe.Alignof(d.s))
fmt.Println(unsafe.Alignof(d.i))
fmt.Println(unsafe.Alignof(d.f))
fmt.Println(unsafe.Alignof(d.bs))
fmt.Println("Offsetof:")
fmt.Println(unsafe.Offsetof(d.s))
fmt.Println(unsafe.Offsetof(d.i))
fmt.Println(unsafe.Offsetof(d.f))
fmt.Println(unsafe.Offsetof(d.bs))
fmt.Println("Sizeof:")
fmt.Println(unsafe.Sizeof(d.s))
fmt.Println(unsafe.Sizeof(d.i))
fmt.Println(unsafe.Sizeof(d.f))
fmt.Println(unsafe.Sizeof(d.bs))
}
执行结果:
$ go run main.go Alignof: 8 8 8 8 Offsetof: 0 16 24 32 Sizeof: 16 8 8 24
unsafe.Pointer
这个类型相当于 C语言 里的 void *
。举个例子,如果想把 []byte
转换成 string 或者反之,该怎么做呢?看看fasthttp里的一段代码:
// b2s converts byte slice to a string without memory allocation.
// See https://groups.google.com/forum/#!msg/Golang-Nuts/ENgbUzYvCuU/90yGx7GUAgAJ .
//
// Note it may break if string and/or slice header will change
// in the future go versions.
func b2s(b []byte) string {
return *(*string)(unsafe.Pointer(&b))
}
// s2b converts string to a byte slice without memory allocation.
//
// Note it may break if string and/or slice header will change
// in the future go versions.
func s2b(s string) []byte {
sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
bh := reflect.SliceHeader{
Data: sh.Data,
Len: sh.Len,
Cap: sh.Len,
}
return *(*[]byte)(unsafe.Pointer(&bh))
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Clean Architecture
Robert C. Martin / Prentice Hall / 2017-9-20 / USD 34.99
Practical Software Architecture Solutions from the Legendary Robert C. Martin (“Uncle Bob”) By applying universal rules of software architecture, you can dramatically improve developer producti......一起来看看 《Clean Architecture》 这本书的介绍吧!