go语言的unsafe包是干什么用的

在go语言中,如果你想要打印一个字符串的大小,可以用unsafe包里sizeof,比如这样:、

unsafe.Sizeof("我是字符串")

但是unsafe包从字面上就能看出这玩意不安全,所以这个包是干啥的。

其实unsafe包它提供了一些与底层编程相关的功能。unsafe 包允许我们绕过 Go 语言的类型系统和内存安全机制,直接操作指针和内存。

因为绕开了安全机制,所以他叫unsafe,在日常的开发中是不建议使用的,除非已经反复论证过没问题,一般这包都是debug用的。

因为,使用 unsafe 包可以进行一些底层的操作,例如:

  • 使用 unsafe.Pointer 类型可以将任意类型的指针转换为另一个类型的指针,而不进行类型检查。
    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    func main() {
        var num int = 42
        ptr := unsafe.Pointer(&num)
        fmt.Println(*(*int)(ptr)) // 输出: 42
    }
    

  • 使用 uintptr 类型可以将指针转换为无类型的整数值,以及将无类型的整数值转换为指针。
    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    func main() {
        var num int = 42
        ptr := uintptr(unsafe.Pointer(&num))
        num2 := *(*int)(unsafe.Pointer(ptr))
        fmt.Println(num2) // 输出: 42 为啥总是42,哈哈,请看银河系漫游指南
    }
    

  • 使用 unsafe.Sizeof 函数可以获取一个类型的大小(以字节为单位),包括结构体的大小、数组的大小等。
    package main
    
    import (
        "fmt"
        "unsafe"
    )
    
    type Person struct {
        Name string
        Age  int
    }
    
    func main() {
        size := unsafe.Sizeof(Person{})
        fmt.Println(size) // 输出: 16
    }
    

你可能感兴趣的:(golang笔记,golang,开发语言)