全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Golang中使用指针_Golang指针声明与取地址方法

Go指针是安全受控的引用机制,声明为*T,需用&或new()初始化;不可对字面量、表达式、map元素取地址;传指针用于修改原值或避免大结构体拷贝;须防nil解引用和意外共享。

Go 语言中的指针不是“C 风格的危险玩具”,而是明确、安全、且被编译器严格约束的引用机制。你不能对指针做算术运算,也不能随意转换类型,nil 检查天然友好——只要理解 &* 的语义边界,就不会踩空。

如何声明和初始化指针变量

Go 中指针类型写法是 *T,表示“指向类型 T 的值的地址”。声明时不会自动分配内存,必须显式赋值或用 new() / & 初始化。

  • var p *int:声明一个未初始化的指针,值为 nil;直接解引用会 panic
  • p := new(int):分配一个 int 的零值内存,并返回其地址,等价于 p := &zero_int
  • val := 42; p := &val:取已有变量的地址,最常用也最直观

注意:new(T) 返回的是 *T,但只适用于需要零值初始化的场景;而 &v 要求 v 是可寻址的(不能是字面量、函数调用结果、map 元素等)。

哪些值不能取地址(&v 会报错)

Go 编译器禁止对不可寻址的值取地址,这是为了防止悬垂指针和语义混乱。常见报错如:cannot take the address of ...

  • &42 ❌ 字面量不可寻址
  • &(x + y) ❌ 表达式结果是临时值
  • &myMap["key"] ❌ map 元素地址不固定,Go 不允许取地址
  • &mySlice[i] ✅ 切片元素可寻址(只要 mySlice 本身可寻址)
  • &structField ✅ 结构体字段可寻址(前提是整个结构体变量可寻址)

如果真需要类似效果(比如想修改 map 中某个字段),得先取出值到局部变量,修改后再写回:v := myMap["key"]; v.Field = 123; myMap["key"] = v

传指针 vs 传值:什么时候必须用指针

是否传指针,核心看两点:是否要修改原值,以及值的大小是否值得避免拷贝。Go 默认传值,但结构体、切片、map、func、channel 本身已是引用类型(内部含指针),它们的“传值”只是复制头信息。

  • 修改调用方变量内容 → 必须传指针:func increment(p *int) { *p++ }
  • 大结构体(> few hundred bytes)→ 建议传指针避免拷贝开销
  • 小结构体(如 type Point struct{ X, Y int })→ 传值更高效,且更利于逃逸分析优化
  • 接收者方法中:若方法需修改 receiver → 接收者必须是 *T;若只读 → T*T 都可,但统一用 *T 更常见(避免混用)

别迷信“所有结构体都要用指针接收者”。过度使用指针反而阻碍内联、增加 GC 压力,且让 nil 接收者调用变得可能(有时是 bug)。

常见错误:nil 指针解引用与意外共享

最典型的 panic 是 panic: runtime error: invalid memory address or nil pointer dereference,通常来自忘记检查 nil 就直接 * 解引用或调用方法。

func printName(p *string) {
    fmt.Println(*p) // 如果 p == nil,这里 panic
}
// 正确做法:
if p != nil {
    fmt.Println(*p)
}

另一个隐性坑是:多个变量指向同一块内存,修改一处影响全局。比如把结构体指针存进 map 或 slice 后反复复用,容易导致意料外的状态污染。调试时注意用 fmt.Printf("%p", p) 打印地址确认是否真共享。

指针真正的复杂点不在语法,而在生命周期和所有权意图——它把“谁负责初始化、谁负责释放(虽然 Go 有 GC)、谁有权修改”这些契约,明明白白写进了类型签名里。


# go  # golang  # golang指针  # red  # Error  # printf  # 局部变量  # 结构体  # int  # 指针  # 引用类型  # 指针类型  # Struct  # var  # pointer  # 切片  # nil  # map  # channel  # bug  # 报错  # 的是  # 这是  # 原值  # 多个  # 什么时候  # 已有  # 而在  # 适用于  # 进了 


相关文章: 官网自助建站平台指南:在线制作、快速建站与模板选择全解析  网站制作新手教程,新手建设一个网站需要注意些什么?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  建站之家VIP精选网站模板与SEO优化教程整合指南  广东企业建站网站优化与SEO营销核心策略指南  建站之星安装步骤有哪些常见问题?  建站三合一如何选?哪家性价比更高?  ,想在网上投简历,哪几个网站比较好?  外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何在阿里云购买域名并搭建网站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何用腾讯建站主机快速创建免费网站?  Swift中循环语句中的转移语句 break 和 continue  建站中国官网:模板定制+SEO优化+建站流程一站式指南  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  已有域名能否直接搭建网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  XML的“混合内容”是什么 怎么用DTD或XSD定义  如何选择美橙互联多站合一建站方案?  韩国服务器如何优化跨境访问实现高效连接?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  ,柠檬视频怎样兑换vip?  想学网站制作怎么学,建立一个网站要花费多少?  ,如何利用word制作宣传手册?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  安徽网站建设与外贸建站服务专业定制方案  如何快速生成可下载的建站源码工具?  网站制作网站,深圳做网站哪家比较好?  深圳网站制作的公司有哪些,dido官方网站?  香港服务器租用费用高吗?如何避免常见误区?  如何登录建站主机?访问步骤全解析  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何在搬瓦工VPS快速搭建网站?  红河网站制作公司,红河事业单位身份证如何上传?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  内部网站制作流程,如何建立公司内部网站?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星各版本价格是多少?  广州美橙建站如何快速搭建多端合一网站?  如何零基础在云服务器搭建WordPress站点?  如何快速搭建响应式可视化网站?  开源网站制作软件,开源网站什么意思?  建站之星如何保障用户数据免受黑客入侵? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。