美文网首页
go常用包——unsafe

go常用包——unsafe

作者: chase_lwf | 来源:发表于2020-09-13 10:50 被阅读0次

unsafe

1 unsafe包简介

unsafe包顾名思义,是非安全的,是面向编译器的一个包,使用它要特别小心,unsafe包可以绕过Go的内存机制,对内存进行读写;

2 unsafe 主要变量

  • unsafe.Pointer
type ArbitraryType int
type Pointer *ArbitraryType

ArbitraryType是int的别名,在go中赋予特殊的含义,指代任意一种类型,pointer是一种特殊的指针类型,可以存储任意一种指针类型的值,可以看做pointer是不同指针类型转换的中间层:
*T1 <-> Pointer <-> *T2

  • uintptr
    uintptr是go 内置的一个类型,可以存储任何类型指针的整型,指针之间不可以直接进行运算,但是可以通过uintptr进行指针运算

3 四个规则

  • 任何指针都可以转换为unsafe.Pointer
  • unsafe.Pointer可以转换为任何指针
  • uintptr可以转换为unsafe.Pointer
  • unsafe.Pointer可以转换为uintptr

4 unsafe包的主要函数

1 SizeOf 函数-》 返回一个类型占用的内存大小,是类型占用的字节数,不是该类型存储的内容大小,go里面的int和int64都是用8个字节存储;
    b := true
    i8 := int8(111)
    i16 := int16(11)
    i32 := int32(111111111)
    i64 := int64(1)
    i := 1
    s := "s"

    fmt.Println(unsafe.Sizeof(b))
    fmt.Println(unsafe.Sizeof(i8))
    fmt.Println(unsafe.Sizeof(i16))
    fmt.Println(unsafe.Sizeof(i32))
    fmt.Println(unsafe.Sizeof(i64))
    fmt.Println(unsafe.Sizeof(i))
    fmt.Println(unsafe.Sizeof(s))
1
1
2
4
8
8
16

2 Alignof() ->  返回类型的对齐值

3  Offsetof() -> 只适用于struct结构体中的字段相对于结构体的内存位置偏移量。结构体的第一个字段的偏移量都是0.

4 unsafe包用法
4.1 指针类型转换
4.2 修改结构体未导出字段

引用:
[https://www.flysnow.org/2017/07/06/go-in-action-unsafe-pointer.html]
https://www.jianshu.com/p/c394436ec9e5

相关文章

网友评论

      本文标题:go常用包——unsafe

      本文链接:https://www.haomeiwen.com/subject/nxsnektx.html