GO语言篇之unsafe
文章目录
- GO语言篇之unsafe
- 前言
- 获取变量的内存地址
- 将指针转换为不同类型的指针
- 获取结构体字段的偏移量
- 获取变量的大小和对齐方式
前言
Go语言的unsafe包可以让我们绕过类型系统,直接操作内存,但是它的操作内存的能力还是有限的
unsafe包中的函数有以下几种类型:
关于指针的函数:如Pointer型函数可以将指针转化为uintptr型,以及指针的比较、加减等操作关于引用的函数:如Sizeof函数可以计算一个变量的字节大小,Align函数返回一个类型的对齐方式,Offsetof函数返回一个结构体字段相对于结构体起始地址的偏移量
获取变量的内存地址
import ("unsafe""fmt"
)func main() {var num int = 666ptr := unsafe.Pointer(&num)fmt.Println(ptr) // 输出变量num的内存地址
}
将指针转换为不同类型的指针
import ("unsafe""fmt"
)func main() {var num int = 666var uintNum uint = *(*uint)(unsafe.Pointer(&num))fmt.Println(num, uintNum)
}
获取结构体字段的偏移量
import ("unsafe""fmt"
)type Person struct {Name stringAge intHeight float64
}func main() {nameOffset := unsafe.Offsetof(Person{}.Name)ageOffset := unsafe.Offsetof(Person{}.Age)heightOffset := unsafe.Offsetof(Person{}.Height)fmt.Println(nameOffset, ageOffset, heightOffset) // 输出字段的偏移量
}
获取变量的大小和对齐方式
import ("unsafe""fmt"
)type Person struct {Age intWeight float64Height float64
}func main() {size := unsafe.Sizeof(Person{})align := unsafe.Alignof(Person{})fmt.Println(size, align) // 输出结构体的大小和对齐方式
}