网站首页 > 文章中心 > 其它

go语言标签哪里结束

作者:小编 更新时间:2023-09-20 13:04:50 浏览量:200人看过

Go语言使用 map 时尽量不要在 big map 中保存指针

不知道你有没有听过这么一句:在使用 map 时尽量不要在 big map 中保存指针.好吧,你现在已经听过了:)为什么呢?原因在于 Go 语言的垃圾回收器会扫描标记 map 中的所有元素,GC 开销相当大,直接GG.

这两天在<>中看到 GC 这一章节里面对比 map 和 slice 在垃圾回收中的效率对比,书中只给出结论没有说明理由,这我是不能忍的,于是有了这篇学习笔记.扯那么多,Show Your Code

这是一个简单的测试程序,保存字符串的 map 和 保存整形的 map GC 的效率相差几十倍,是不是有同学会说明明保存的是 string 哪有指针?这个要说到 Go 语言中 string 的底层实现了,源码在 src/runtime/string.go里,可以看到 string 其实包含一个指向数据的指针和一个长度字段.注意这里的是否包含指针,包括底层的实现.

Go 语言的 GC 会递归遍历并标记所有可触达的对象,标记完成之后将所有没有引用的对象进行清理.扫描到指针就会往下接着寻找,一直到结束.

无脑机翻如下:

如果我们有一个map [k] v,其中k和v都不包含指针,并且我们想提高扫描性能,则可以执行以下操作.

将" allOverflow [] unsafe.Pointer"添加到 hmap 并将所有溢出存储桶存储在其中. 然后将 bmap 标记为noScan. 这将使扫描非常快,因为我们不会扫描任何用户数据.

实际上,它将有些复杂,因为我们需要从allOverflow中删除旧的溢出桶. 而且它还会增加 hmap 的大小,所以呢也可能需要重新整理数据.

最终官方在 hmap 中增加了 overflow 相关字段完成了上面的优化,这是具体的 commit 地址.

通过注释可以看出,如果 map 中保存的键值都不包含指针(通过 Haspointers 判断),就使用一个 uintptr 类型代替 bucket 的指针用于溢出桶 overflow 字段,uintptr 类型在 GO 语言中就是个大小可以保存得下指针的整数,不是指针,就相当于实现了 将 bmap 标记为 noScan, GC 的时候就不会遍历完整个 map 了.随着不断的学习,愈发感慨 GO 语言中很多模块设计得太精妙了.

差不多说清楚了,能力有限,有不对的地方欢迎留言讨论,源码位置还是问的群里大佬 _

go语言中有没有关键字failure和success

go语言--Goroutines

①.、goroutine:在go语言中,每一个并发的执行单元叫做goroutine,如果一个程序中包含多个goroutine,对两个函数的调用则可能发生在同一时刻

讲讲go语言的结构体

作为C语言家族的一员,go和c一样也支持结构体.可以类比于java的一个POJO.

在学习定义结构体之前,先学习下定义一个新类型.

这里要引入一个底层类型的概念.

如果一个新类型是基于某个 Go 原生类型定义的, 那么我们就叫 Go 原生类型为新类型的底层类型

在上面的例子中,int就是T1的底层类型.

底层类型是很重要的,因为对两个变量进行显式的类型转换,只有底层类型相同的变量间才能相互转换.底层类型是判断两个类型本质上是否相同的根本.

这种类型定义方式通常用在 项目的渐进式重构,还有对已有包的二次封装方面

类型别名表示新类型和原类型完全等价,实际上就是同一种类型.只不过名字不同而已.

一般我们都是定义一个有名的结构体.

字段名的大小写决定了字段是否包外可用.只有大写的字段可以被包外引用.

还有一个点提一下

如果换行来写

new返回的是一个指针.然后指针可以直接点号赋值.这说明go默认进行了取值操作

如上定义了一个空的结构体Empty.打印了元素e的内存大小是0.

有什么用呢?

基于空结构体类型内存零开销这样的特性,我们在日常 Go 开发中会经常使用空 结构体类型元素,作为一种"事件"信息进行 Goroutine 之间的通信

这种以空结构体为元素类建立的 channel,是目前能实现的、内存占用最小的 Goroutine 间通信方式.

这种形式需要说的是几个语法糖.

语法糖1:

对于结构体字段,可以省略字段名,只写结构体名.默认字段名就是结构体名

这种方式称为 嵌入字段

如果是以嵌入字段形式写的结构体

可以省略嵌入的Reader字段,而直接访问ReaderName

此时book是一个各个属性全是对应类型零值的一个实例.不是nil.这种情况在Go中称为零值可用.不像java会导致npe

结构体定义时可以在字段后面追加标签说明.

tag的格式为反单引号

tag的作用是可以使用[反射]来检视字段的标签信息.

具体的作用还要看使用的场景.

比如这里的tag是为了帮助 encoding/json 标准包在解析对象时可以利用的规则.比如omitempty表示该字段没有值就不打印出来.

以上就是土嘎嘎小编为大家整理的go语言标签哪里结束相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章