Go语言标准库学习之unsafe——不安全的标准库(不同类型指针之间的转换)

本文深入探讨了Go语言中的unsafe包,介绍了其核心类型和方法,包括Pointer和uintptr的使用,以及Sizeof、Alignof和Offsetof函数的功能。通过实例展示了如何进行指针类型转换和复杂的结构体操作,强调了使用unsafe包时的潜在风险。

unsafe包提供了一些跳过go语言类型安全限制的操作。这个标准库用的比较少,这篇博客向大家介绍以下,如何使用unsafe包,希望对你有帮助。

1. unsafe包介绍
(1)两种重要类型
  • ArbitraryType

    // ArbitraryType表示任意一种类型,但并非一个实际存在与unsafe包的类型。
    type ArbitraryType int
    
  • Pointer

    // Pointer类型用于表示任意类型的指针。
    type Pointer *ArbitraryType
    

    有4个特殊的只能用于Pointer类型的操作:

    • 任意类型的指针可以转换为一个Pointer类型值。
    • 一个Pointer类型值可以转换为任意类型的指针。
    • 一个uintptr类型值可以转换为一个Pointer类型值。
    • 一个Pointer类型值可以转换为一个uintptr类型值。

    因此,Pointer类型允许程序绕过类型系统读写任意内存。使用它时必须谨慎。

(2)三个方法

  • Sizeof

    // Sizeof返回类型v本身数据所占用的字节数。
    // 返回值是“顶层”的数据占有的字节数。
    // 例如,若v是一个切片,它会返回该切片描述符的大小,而非该切片底层引用的内存的大小。
    func Sizeof(v ArbitraryType) uintptr
    
  • Alignof

    // Alignof返回类型v的对齐方式(即类型v在内存中占用的字节数)
    // 若是结构体类型的字段的形式,它会返回字段f在该结构体中的对齐方式。
    func Alignof(v ArbitraryType) ui
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值