GO语言篇之unsafe

GO语言篇之unsafe

文章目录

  • GO语言篇之unsafe
    • 前言
    • 获取变量的内存地址
    • 将指针转换为不同类型的指针
    • 获取结构体字段的偏移量
    • 获取变量的大小和对齐方式

前言

Go语言的unsafe包可以让我们绕过类型系统,直接操作内存,但是它的操作内存的能力还是有限的

unsafe包中的函数有以下几种类型:

关于指针的函数:如Pointer型函数可以将指针转化为uintptr型,以及指针的比较、加减等操作

关于引用的函数:如Sizeof函数可以计算一个变量的字节大小,Align函数返回一个类型的对齐方式,Offsetof函数返回一个结构体字段相对于结构体起始地址的偏移量

获取变量的内存地址

import (
    "unsafe"
    "fmt"
)

func main() {
    var num int = 666
    ptr := unsafe.Pointer(&num)
    fmt.Println(ptr)  // 输出变量num的内存地址
}

将指针转换为不同类型的指针

import (
    "unsafe"
    "fmt"
)

func main() {
    var num int = 666
    var uintNum uint = *(*uint)(unsafe.Pointer(&num))
    fmt.Println(num, uintNum)
}

获取结构体字段的偏移量

import (
    "unsafe"
    "fmt"
)

type Person struct {
    Name   string
    Age    int
    Height 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    int
    Weight float64
    Height float64
}

func main() {
    size := unsafe.Sizeof(Person{})
    align := unsafe.Alignof(Person{})
    fmt.Println(size, align)  // 输出结构体的大小和对齐方式
}

你可能感兴趣的:(Go,golang,c++,开发语言)