Go的unsafe包

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

内容简介:常规的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))
}

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

查看所有标签

猜你喜欢:

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

Python编程初学者指南

Python编程初学者指南

[美]Michael Dawson / 王金兰 / 人民邮电出版社 / 2014-10-1

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python可以用于很多的领域,从科学计算到游戏开发。 《Python编程初学者指南》尝试以轻松有趣的方式来帮助初学者掌握Python语言和编程技能。《Python编程初学者指南》共12章,每一章都会用一个完整的游戏来演示其中的关键知识点,并通过编写好玩的小软件这种方式来学习编程,引发读者的兴趣,降低学习的难度。每章最后都会......一起来看看 《Python编程初学者指南》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具