当前位置:首页 > 科技  > 软件

Go 中的指针:了解内存引用

来源: 责编: 时间:2023-10-26 17:11:01 443观看
导读在 Go 中,指针是强大而重要的功能,它允许开发人员直接处理内存地址并实现高效的数据操作。指针提供了一种传递数据引用而不是复制整个数据的方法,这对大型数据结构尤其有益。了解指针在 Go 中的工作原理对于编写高效、高

在 Go 中,指针是强大而重要的功能,它允许开发人员直接处理内存地址并实现高效的数据操作。指针提供了一种传递数据引用而不是复制整个数据的方法,这对大型数据结构尤其有益。了解指针在 Go 中的工作原理对于编写高效、高性能的代码至关重要。khj28资讯网——每日最新资讯28at.com

khj28资讯网——每日最新资讯28at.com

  • 它用于声明指针变量。例如,*int 表示指向整数的指针,*string 表示指向字符串的指针,等等。
  • 它还用于取消引用指针,即访问存储在指针变量指向的内存地址上的值。
  • 用于获取变量的内存地址。例如,&num 表示变量 num 的内存地址。
  • 它通常用于处理指针、将变量的内存地址传递给函数或使用现有变量初始化指针。

khj28资讯网——每日最新资讯28at.com

声明指针并对其解引用的示例:khj28资讯网——每日最新资讯28at.com

var num int = 42var ptr *int       // 声明指针ptr = &num         // 将 num 的内存地址赋值给 ptrfmt.Println(*ptr)  // 打印出 ptr 地址的值

让我们深入研究更多的例子。khj28资讯网——每日最新资讯28at.com

在Go语言中,指针用类型前面的*符号表示。例如,**int表示指向整数的指针。要访问存储在指针所指向的内存地址中的值,可以在指针变量前使用**符号。khj28资讯网——每日最新资讯28at.com

下面是一个简单的Go语言指针示例:khj28资讯网——每日最新资讯28at.com

package mainimport "fmt"func main() { // 定义一个整形参数 var num int = 42 // 将 num 的内存地址赋予 ptr var ptr *int = &num // 打印出 num 的值和内存地址 fmt.Printf("Value of 'num': %d/n", num) fmt.Printf("Memory address of 'num': %p/n", &num) // 打印出 ptr 内存地址中的值 fmt.Printf("Value pointed by 'ptr': %d/n", *ptr) // 改变 ptr 内存中的值 *ptr = 100 // num 的值改变了,因为 ptr 内存的值改变了 fmt.Printf("New value of 'num': %d/n", num)}

解释:khj28资讯网——每日最新资讯28at.com

  • 声明一个整型变量num,并将值42赋值给它。
  • 声明一个指向整型ptr的指针,并使用&符号将num的内存地址赋值给它。
  • 输出num的值、num的内存地址和ptr所指向的值(使用*符号)。
  • 然后将ptr所指向的内存地址的值更改为100,这也更改了num的值,因为它们共享相同的内存地址。

当您运行上述代码时,您将看到如下的输出:khj28资讯网——每日最新资讯28at.com

Value of 'num': 42Memory address of 'num': 0xc0000... (some hexadecimal address)Value pointed by 'ptr': 42New value of 'num': 100

在Go中,您可以使用带有结构的指针来传递对结构实例的引用,而不是复制整个结构。当您想要高效地操作大型结构体而不产生复制它们的成本时,这一点尤其有用。khj28资讯网——每日最新资讯28at.com

下面是一个在Go:goCopy代码中使用指针和结构体的例子:khj28资讯网——每日最新资讯28at.com

package mainimport "fmt"// 定义一个简单的结构体type Person struct { Name   string Age    int IsMale bool}// 这个方法接收 person 的指针,并调整其字段为新的值func modifyPerson(p *Person, newName string, newAge int) { p.Name = newName p.Age = newAge}func main() { // 创建一个 person 指针 personPtr := &Person{Name: "John", Age: 30, IsMale: true} // 先打印出来初始化的值 fmt.Printf("Initial Name: %s, Age: %d/n", personPtr.Name, personPtr.Age) modifyPerson(personPtr, "Jane", 25) // 打印出改变后的对象 fmt.Printf("Updated Name: %s, Age: %d/n", personPtr.Name, personPtr.Age)}

解释:khj28资讯网——每日最新资讯28at.com

  • 我们定义了一个简单的 Person 结构体,它有三个字段: Name、Age和IsMale。
  • 我们声明了一个函数modifyPerson,它接受一个指向Person结构体的指针作为它的第一个参数。这个函数修改人员的Name和Age字段。
  • 在main函数中,我们创建了一个指向名为personPtr的Person结构体的指针,并用值对其进行初始化。
  • 我们使用 fmt.Printf 打印人员的初始值。
  • 我们调用modifyPerson函数,传递指向personPtr的指针以及Name和Age的新值。
  • modifyPerson函数更新personPtr所指向的人的Name和Age字段。
  • 我们打印人员的更新值,以显示修改已经生效。

当您运行代码时,您将看到如下输出:khj28资讯网——每日最新资讯28at.com

Initial Name: John, Age: 30Updated Name: Jane, Age: 25

正如您所看到的,使用指向结构体的指针允许我们直接修改结构体实例,并且这些更改反映在进行修改的函数之外。这避免了创建整个结构体的新副本的需要,使代码更高效和内存友好,特别是对于大型结构体。khj28资讯网——每日最新资讯28at.com

这些示例演示了指针如何允许我们通过使用内存地址而不是实际值来直接访问和修改底层数据。指针在处理大型数据结构(如数组、切片和复杂对象)时特别有用,因为它们可以防止不必要的数据复制并提高性能。khj28资讯网——每日最新资讯28at.com

记住要小心处理指针,因为指针的不当使用会导致空指针解引用和内存泄漏等错误。与其他语言相比,Go通过提供垃圾收集使指针的使用相对安全,但它仍然需要注意内存管理。khj28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15203-0.htmlGo 中的指针:了解内存引用

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一个不太好用的 IDEA 代码生成插件

下一篇: 使用Golang策略和优秀实践高效处理一百万个请求

标签:
  • 热门焦点
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz“难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?”这一番话,出自百合网联合创
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。“提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,“7
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top