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)  // 输出结构体的大小和对齐方式
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉墨居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值