新闻中心

如何使用Golang实现指针与引用_Golang 指针使用与操作实践

2025-11-25
浏览次数:
返回列表
指针是存储变量内存地址的变量,通过&取地址、*解引用。Go中用指针实现函数间共享修改数据,避免大对象复制,new(T)返回T类型零值指针,make仅用于slice、map、channel初始化,解引用nil指针会panic,函数常返回指针+error需判空处理。

如何使用golang实现指针与引用_golang 指针使用与操作实践

在 Golang 中,指针和引用是操作变量内存地址的核心机制。虽然 Go 是一门高级语言,隐藏了许多底层细节,但理解指针对于编写高效、灵活的代码至关重要。本文将直接切入重点,讲解如何在实际开发中正确使用指针与引用。

什么是指针?

指针是一个变量,它存储另一个变量的内存地址。通过指针,可以直接读取或修改该地址上的值。在 Go 中,使用 & 获取变量地址,使用 * 解引用访问值。

示例:

name := "Alice"<br>
  ptr := &name                    // ptr 是 *string 类型,保存 name 的地址<br>
  fmt.Println(ptr)               // 输出类似 0xc000010230(地址)<br>
  fmt.Println(*ptr)              // 输出 Alice(解引用)

改变指针指向的值会影响原始变量:

*ptr = "Bob"<br>
  fmt.Println(name)              // 输出 Bob

函数中使用指针传递

Go 默认按值传递参数,这意味着函数接收到的是原始数据的副本。如果想在函数内部修改原变量,必须传入指针。

场景:交换两个整数

func swap(a, b *int) {<br>
    *a, *b = *b, *a<br>
  }

x, y := 10, 20<br>
  swap(&x, &y)<br>
  fmt.Println(x, y) // 输出 20 10

结构体常配合指针使用,避免复制大对象:

type Person struct {<br>
    Name string<br>
    Age  int<br>
  }

func (p *Person) SetName(newName string) {<br>
    p.Name = newName<br>
  }

p *Person 表示该方法作用于指针类型,可修改原结构体。

new 与 make 的区别

new(T) 用于创建任意类型的零值,并返回其指针:

numPtr := new(int)<br>
  *numPtr = 42<br>
  fmt.Println(*numPtr) // 输出 42

make(T) 仅用于 slice、map 和 channel,初始化后返回类型本身(非指针),但其底层数据是引用类型。

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修

错误用法:mptr := make(*map[string]int) ❌ 不支持

正确方式:m := make(map[string]int) ✅ 返回的就是可用的 map

nil 指针与安全检查

未初始化的指针为 nil。解引用 nil 指针会引发 panic。

var p *int<br>
  if p != nil {<br>
    fmt.Println(*p)<br>
  } else {<br>
    fmt.Println("指针为空")<br>
  }

常见模式:函数返回可能失败时返回指针 + error:

func findUser(id int) (*User, error) {<br>
    if id == 1 {<br>
      user := User{Name: "Tom"}<br>
      return &user, nil<br>
    }<br>
    return nil, fmt.Errorf("用户不存在")<br>
  }

调用时需判断是否为 nil:

u, err := findUser(99)<br>
  if err != nil || u == nil {<br>
    log.Println(err)<br>
    return<br>
  }<br>
  fmt.Println(u.Name)

基本上就这些。掌握指针的关键在于理解何时需要共享或修改数据,以及避免不必要的拷贝。不复杂但容易忽略。

以上就是如何使用Golang实现指针与引用_Golang 指针使用与操作实践的详细内容,更多请关注其它相关文章!


# 正则表达式  # 泰州网站建设经验  # 黄山外贸网站推广建设  # 常熟大型网站建设哪家好  # 搜索引擎如何推广网站  # 兴山宜昌网站建设咨询  # seo发外链工作  # SEO网站系统人群  # 网站推广渠道公司  # 陌陌网络营销推广的现状  # seo贴吧发帖  # 解决问题  # go  # 可以直接  # 不存在  # 中文网  # 相关文章  # 是一个  # 的是  # 如何使用  # 美图  # 区别  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  支付宝如何设置安全保护_支付宝安全设置的全面教程  深入理解J*aScript中的B样条曲线与节点向量生成  使用J*aScript检测输入元素是否包含在特定类中  vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法  Mac怎么使用表情符号_Mac Emoji快捷键面板  PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  b站怎么删除评论_b站评论管理与删除操作  Go语言JSON解析深度指南:动态访问与结构体映射实践  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  美团外卖商家服务中心入口 美团商家版官网入口  浏览器打开即用 美图秀秀网页版入口  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  抖音从哪里进入网页版_抖音官方入口链接  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  J*aScript中管理异步API调用:确保操作顺序与数据一致性  深入理解与实现最大堆的Heapify过程:常见错误与修正  微信商城在哪里打开【步骤】  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  Go语言HTML解析:利用Goquery精准获取指定元素内容  React Hooks最佳实践:动态组件状态管理的组件化方案  Go调试环境为何无法启动_Go调试器启动失败原因与解决策略  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  基于动态规划的房屋花卉种植最小成本算法详解  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示  深入理解J*a合成构造器:何时以及为何阻止其生成  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  J*aScript动态修改指定div内所有a标签样式指南  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  千牛数据看板网页版_千牛数据看板网页版访问方法  4399体育竞技小游戏_4399小游戏赛事入口  J*aScript map 方法中处理循环元素为空数组的策略  Log4j Console Appender性能瓶颈与高并发优化策略  蛙漫官方正版入口 蛙漫网页在线全集免费观看  12306选座怎么选到临时改签座_12306改签选座策略与步骤  使用Pandas转换并合并DataFrame:多列映射至统一结构  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南 

搜索