Golang对比Java、python为什么要保留指针

这篇具有很好参考价值的文章主要介绍了Golang对比Java、python为什么要保留指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为什么要用指针?

平时我们在Golang使用指针一般是为了以下的情况:

  • 方法直接修改原来对象
  • 保证参数传递的自由,可以在传递重量级对象时使用指针

但Go 保留指针不仅仅是为了解决传递参数的问题,还跟它的语言特性有密不可分的联系。

值语义

Go 里面的变量是值语义,这个跟 C/C++是一脉相承的。比如一个结构体变量赋值给另外一个变量就是一次内存拷贝,而不是只拷贝一个指针,因此需要指针来表达引用语义,关于拷贝的具体实现可以了解直接值部与间接值部的实现。

关于值语义(value semantics):值语义指的是对象的拷贝与原对象无关,就像拷贝 int 一样。C++ 的内置类型(bool/int/double/char)都是值语义,标准库里的 complex<> 、pair<>、vector<>、map<>、string 等等类型也都是值语意,拷贝之后就与原对象脱离关系。同样,Java 语言的 primitive types 也是值语义。

优点

复杂的高级类型占用的内存往往相对较大,存储在 heap 中,GC 回收频率相对较低,代价也较大,因此传引用/指针可以避免进行成本较高的复制操作,并且节省内存,提高程序运行效率。

为什么要保留值语义,而不是像 Java 或者 Python 一样让复合类型默认都是指针类型呢?因为值语义带来了如下好处:

  • 结构体可以直接用来比较相等,而非比较指针,Java 里面的 == 操作符除了基本类型有用,其他类型几乎没用。
  • 与 C 语言更好地交互。Go 可以通过 cgo 与 C 语言无缝交互。Go 里面的结构体基本上不用特殊处理就能传递给 C 的函数使用。主要得益于 Go 的结构体和 C 的一样都是值类型。
  • 开发者能更好的掌控内存布局。一个结构体数组就是一段连续内存,而不是一个指针数组。
  • 减轻 GC 压力。紧凑的内存布局减少了 GC 对象的个数,比如一个100w 长度的结构体数组就是一个 GC 对象,而不是100w 个。
  • 减轻堆内存的分配压力。函数通过传值的方式传递参数后,原变量不会发生逃逸,可以被分配在栈上

Go 为了内存安全,虽然有指针,但不支持指针算数,但结合 unsafe.Pointer 也可以完成一些非常规情景下的精细内存操作。比如结合 mmap 实现堆外内存管理,runtime 里面的内存管理就是这么来的,完全不用另外用 C 语言来实现。 这也是可以使用 Go 语言来写操作系统(eggos)的原因。

总结:

Go 的指针一方面提供了引用语义,另一方面像 C 语言一样给了开发者灵活管理内存的能力。

参考链接:樊冰心:https://www.zhihu.com/question/399589293/answer/2242103027文章来源地址https://www.toymoban.com/news/detail-797957.html

到了这里,关于Golang对比Java、python为什么要保留指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

    在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。 除了这些基本信息之外,Go 还提供了 struct tags,它可以用来指定 struct 中每个字段的元信息。 在本文中,我们将探讨为什

    2024年02月15日
    浏览(11)
  • 【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

    【Golang】Golang进阶系列教程--为什么 Go 不支持 []T 转换为 []interface

    在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。 举个例子: 不管是传 int 还是 string,最终都能输出正确结果。 那么,既然是这样的话,我就有一个疑问了,拿出我举一反三的能力。是否可以将 []T 转换为 []interface 呢? 比如下面

    2024年02月15日
    浏览(23)
  • 【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    【Golang】Golang进阶系列教程--为什么说 Go 语言字符串是不可变的?

    最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢? 这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。 首先来看看它的底层结构: 和切片的结构很像,只不过少了一个

    2024年02月14日
    浏览(37)
  • c语言中为什么函数传参大多数用指针类型

    在C语言中,函数传参大多数使用指针类型的原因主要有两个: 允许在函数内部修改实参的值:C语言中的函数参数传递是按值传递的,即将实参值拷贝一份到形参中进行操作,对参的修改不会影响实参。而通过使用指类型参数,可以将实参的地址传递给函数,从而在函数内部

    2024年02月09日
    浏览(8)
  • 为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

    为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

    Fasthttp 是一个高性能的 Golang HTTP 框架,它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而非 map 来存储数据,尤其是在处理 HTTP headers 时。 为什么呢? 本文将从简单到复杂,逐步剖析为什么 Fasthttp 选择使用 slice 而非 map,并通过代码示例解释这一

    2024年01月22日
    浏览(8)
  • 是时候回答【我为什么要学习 Go 语言(golang)】这个问题了

    想必每个人在学习新事物之前,都会扪心自问:“我为什么要学习它呢?” 正如我们读 四大名著 一般,也只有在您读过了 四大名著 后,再细看中国几千年历史不就是 天下大势合久必分,分久必合 ,再者,便是与友数人相聚,席间您述说您通勤时所遇到有意思的事了,而您

    2023年04月09日
    浏览(6)
  • 0062__对象指针为NULL,为什么还是可以调用成员函数

    对象指针为NULL,为什么还是可以调用成员函数_空对象指针为什么能调用函数_一颗石头崽儿的博客-CSDN博客

    2024年02月10日
    浏览(8)
  • 【Golang】Golang进阶系列教程--为什么 Go for-range 的 value 值地址每次都一样?

    循环语句是一种常用的控制结构,在 Go 语言中,除了 for 以外,还有一个 range ,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。 但是在使用 for-range 循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里

    2024年02月15日
    浏览(11)
  • SAP ERP与国内ERP系统的对比,为什么建议选SAP

    SAP ERP与国内ERP系统的对比,为什么建议选SAP

    德国制造业的领先是全世界有目共睹的,这是因为德国制造业并不相信人,而是相信精确度极高的机器以及最重要的数据。我们的中国制造2025也是以德国的工业40为参考,因此,对国内工业的升级来说,德国制造业是非常有借鉴参考意义的。 这也是笔者为什么要讲国内外ER

    2024年02月11日
    浏览(8)
  • 建站为什么需要服务器?(Web服务器与计算机对比)

    建站为什么需要服务器?(Web服务器与计算机对比)

    ​ 在部署网站时,底层基础设施在确保最佳性能、可靠性和可扩展性方面发挥着至关重要的作用。虽然大多数人都熟悉个人计算机 (PC) 作为日常工作和个人任务的设备,但 PC 和 Web 服务器之间存在显著差异。在这篇文章中,我们将讨论这些差异是什么,并解释为什么服务器对

    2024年01月20日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包