资讯专栏INFORMATION COLUMN

有点不安全却又一亮的 Go unsafe.Pointer

kviccn / 2037人阅读

摘要:因为它是不安全的,但是在特殊的场景下,使用了它。可以打破的类型和内存安全机制,让你获得眼前一亮的惊喜效果

在上一篇文章 《深入理解 Go Slice》 中,大家会发现其底层数据结构使用了 unsafe.Pointer。因此想着再介绍一下其关联知识

原文地址:有点不安全却又一亮的 Go unsafe.Pointer

前言

在大家学习 Go 的时候,肯定都学过 “Go 的指针是不支持指针运算和转换” 这个知识点。为什么呢?

首先,Go 是一门静态语言,所有的变量都必须为标量类型。不同的类型不能够进行赋值、计算等跨类型的操作。那么指针也对应着相对的类型,也在 Compile 的静态类型检查的范围内。同时静态语言,也称为强类型。也就是一旦定义了,就不能再改变它

错误示例
func main(){
    num := 5
    numPointer := &num

    flnum := (*float32)(numPointer)
    fmt.Println(flnum)
}

输出结果:

# command-line-arguments
...: cannot convert numPointer (type *int) to type *float32

在示例中,我们创建了一个 num 变量,值为 5,类型为 int。取了其对于的指针地址后,试图强制转换为 *float32,结果失败...

unsafe

针对刚刚的 “错误示例”,我们可以采用今天的男主角 unsafe 标准库来解决。它是一个神奇的包,在官方的诠释中,有如下概述:

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

很可能会是不可移植的

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

简单来讲就是,不怎么推荐你使用。因为它是 unsafe(不安全的),但是在特殊的场景下,使用了它。可以打破 Go 的类型和内存安全机制,让你获得眼前一亮的惊喜效果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29797.html

相关文章

  • 深入理解 Go map:赋值和扩容迁移

    摘要:我相信这样你能更好的读懂这篇文章原文地址深入理解赋值和扩容迁移哈希函数哈希函数,又称散列算法散列函数。而一个好的哈希函数,应当尽量少的出现哈希冲突,以此保证操作哈希表的时间复杂度但是哈希冲突在目前来讲,是无法避免的。 概要 在 上一章节 中,数据结构小节里讲解了大量基础字段,可能你会疑惑需要 #&(!……#(!¥! 来干嘛?接下来我们一起简单了解一下基础概念。再开始研讨今天文章的重点内...

    wudengzan 评论0 收藏0
  • 深度解密Go语言之 map

    摘要:当然,哈希查找表的平均查找效率是,如果哈希函数设计的很好,最坏的情况基本不会出现。选择函数主要考察的是两点性能碰撞概率。再用哈希值的高位,找到此在中的位置,这是在寻找已有的。这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门...

    番茄西红柿 评论0 收藏0
  • 深度解密Go语言之 map

    摘要:当然,哈希查找表的平均查找效率是,如果哈希函数设计的很好,最坏的情况基本不会出现。选择函数主要考察的是两点性能碰撞概率。再用哈希值的高位,找到此在中的位置,这是在寻找已有的。这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。 我要说明的是,这里对 map 的基本用法涉及比较少,我相信可以通过阅读其他入门...

    siberiawolf 评论0 收藏0
  • 深入理解 Go map:初始化和访问元素

    摘要:但是哈希冲突碰撞是不可避免的而在中当满了后,就会使用溢出桶接着存储。并对其长度进行边界值检验初始化初始化哈希因子根据传入的,计算一个可以放下个元素的桶的最小值分配并初始化。 从本文开始咱们一起探索 Go map 里面的奥妙吧,看看它的内在是怎么构成的,又分别有什么值得留意的地方? 第一篇将探讨初始化和访问元素相关板块,咱们带着疑问去学习,例如: 初始化的时候会马上分配内存吗? 底层数...

    vboy1010 评论0 收藏0
  • golang实现仪表控制-visa32.dll方式

    摘要:,语言实现仪表控制可以采用种方式,一种是使用编程,使用驱动自带的文件进行开发,但是感觉怪怪的,感觉这样还不如直接使用进行开发,还有现成的版本可用。硬件信息为查询仪表清单。类型转换是必须的,的是由首字符指针长度组成。 golang,go语言实现仪表控制可以采用2种方式,一种是使用CGO编程,使...

    xcold 评论0 收藏0

发表评论

0条评论

kviccn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<