Go的unsafe包

栏目: Go · 发布时间: 7年前

内容简介:常规的Go代码是可以跨平台的,因为常规代码只关心使用哪种数据结构,而不关心数据结构的内部实现,内部实现细节由编译器处理。而

常规的 Go 代码是可以跨平台的,因为常规代码只关心使用哪种数据结构,而不关心数据结构的内部实现,内部实现细节由编译器处理。

unsafe 这个包就是用来访问内部实现细节的。所以,使用了unsafe这个包的代码,因为Go的编译器实现细节改变,很有可能会造成兼容性问题。

三个函数

unsafe 主要提供了三个函数:

Alignof
Offsetof
Sizeof

看示例:

package main

import (
    "fmt"
    "unsafe"
)

type Demo struct {
    s  string
    i  int
    f  float64
    bs []byte
}

func main() {
    d := Demo{}

    fmt.Println("Alignof:")
    fmt.Println(unsafe.Alignof(d.s))
    fmt.Println(unsafe.Alignof(d.i))
    fmt.Println(unsafe.Alignof(d.f))
    fmt.Println(unsafe.Alignof(d.bs))

    fmt.Println("Offsetof:")
    fmt.Println(unsafe.Offsetof(d.s))
    fmt.Println(unsafe.Offsetof(d.i))
    fmt.Println(unsafe.Offsetof(d.f))
    fmt.Println(unsafe.Offsetof(d.bs))

    fmt.Println("Sizeof:")
    fmt.Println(unsafe.Sizeof(d.s))
    fmt.Println(unsafe.Sizeof(d.i))
    fmt.Println(unsafe.Sizeof(d.f))
    fmt.Println(unsafe.Sizeof(d.bs))
}

执行结果:

$ go run main.go
Alignof:
8
8
8
8
Offsetof:
0
16
24
32
Sizeof:
16
8
8
24

unsafe.Pointer

这个类型相当于 C语言 里的 void * 。举个例子,如果想把 []byte 转换成 string 或者反之,该怎么做呢?看看fasthttp里的一段代码:

// b2s converts byte slice to a string without memory allocation.
// See https://groups.google.com/forum/#!msg/Golang-Nuts/ENgbUzYvCuU/90yGx7GUAgAJ .
//
// Note it may break if string and/or slice header will change
// in the future go versions.
func b2s(b []byte) string {
    return *(*string)(unsafe.Pointer(&b))
}

// s2b converts string to a byte slice without memory allocation.
//
// Note it may break if string and/or slice header will change
// in the future go versions.
func s2b(s string) []byte {
    sh := (*reflect.StringHeader)(unsafe.Pointer(&s))
    bh := reflect.SliceHeader{
        Data: sh.Data,
        Len:  sh.Len,
        Cap:  sh.Len,
    }
    return *(*[]byte)(unsafe.Pointer(&bh))
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

妙趣横生的算法

妙趣横生的算法

杨峰 / 清华大学出版社 / 2010-4 / 49.00元

《妙趣横生的算法(C语言实现)》理论与实践相结合,旨在帮助读者理解算法,并提高C语言编程能力,培养读者的编程兴趣,并巩固已有的C语言知识。全书分为2个部分共10章,内容涵盖了编程必备的基础知识(如数据结构、常用算法等),编程实例介绍,常见算法和数据结构面试题等。《妙趣横生的算法(C语言实现)》最大的特色在于实例丰富,题材新颖有趣,实用性强,理论寓于实践之中。通过《妙趣横生的算法(C语言实现)》的学......一起来看看 《妙趣横生的算法》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具