(十四)golang unsafe.Pointer

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

内容简介:golang 的指针Go语言是个强类型语言。也就是说Go对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查针对刚刚的问题,我们可以采用 unsafe 标准库来解决。在官方的诠释中,有如下概述:

golang 的指针

Go语言是个强类型语言。也就是说 Go 对类型要求严格,不同类型不能进行赋值操作。指针也是具有明确类型的对象,进行严格类型检查

package main

import (
    "fmt"
)

func main() {
    u := string(32)
    i := int32(1)
    fmt.Println(&u, &i) // 打印出地址
    p := &i             // p 的类型是 *int32
    p := &u             // &u的类型是 *string,于 p 的类型不同,不能赋值 会报错
    p := (*string)(&u)  // 这种类型强制转换也是无效的 会报错
    fmt.Println(p)
}

针对刚刚的问题,我们可以采用 unsafe 标准库来解决。在官方的诠释中,有如下概述:

围绕 Go 程序内存安全及类型的操作

很可能会是不可移植的

不受 Go 1 兼容性指南的保护

简单来讲就是,不怎么推荐你使用

package main

import (
    "fmt"
    "unsafe"
)

func main() {
    u := string(32)
    i := int32(1)
    fmt.Println(&u, &i) 
    p := &u            
    p = (*string)(unsafe.Pointer(&i))
    fmt.Println(p)
}
package main

import (
    "fmt"
    "unsafe"
)

type Num struct {
    i string
    j int64
}

func main() {
    n := Num{i: "test", j: 1}
    nPointer := unsafe.Pointer(&n)

    niPointer := (*string)(unsafe.Pointer(nPointer))
    *niPointer = "dr"

    njPointer := (*int64)(unsafe.Pointer(uintptr(nPointer) + unsafe.Offsetof(n.j)))
    *njPointer = 2

    fmt.Printf("n.i: %s, n.j: %d", n.i, n.j)
}

1、uintptr:uintptr 是 Go 的内置类型。返回无符号整数,可存储一个完整的地址。后续常用于指针运算

type uintptr uintptr

2、unsafe.Offsetof:返回变量的字节大小,也就是本文用到的偏移量大小。需要注意的是入参 ArbitraryType 表示任意类型,并非定义的 int。它实际作用是一个占位符

func Offsetof(x ArbitraryType) uintptr
ptr := uintptr(nPointer)

uintptr 类型是不能存储在临时变量中的。因为从 GC 的角度来看,uintptr 类型的临时变量只是一个无符号整数,并不知道它是一个指针地址

因此当满足一定条件后,ptr 这个临时变量是可能被垃圾回收掉的.


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

查看所有标签

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

上瘾

上瘾

[美] 尼尔·埃亚尔、[美] 瑞安·胡佛 / 钟莉婷、杨晓红 / 中信出版集团 / 2017-5 / 49.00元

——为什么我们会习惯性地点开某个App? ——这种使用习惯到底是如何养成的? ——为什么有些产品能让我们戒不掉,而其他的产品却不行? ——是否有什么秘诀能让用户对你的产品形成使用习惯,欲罢不能? 《上瘾》揭示了很多让用户形成使用习惯,甚至“上瘾”的互联网产品服务背后的基 本设计原理,告诉你怎样打造一款让用户欲罢不能的产品。作者根据自己多年的研究、咨询及实际经验,提出了新颖而......一起来看看 《上瘾》 这本书的介绍吧!

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

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

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

HEX CMYK 互转工具