如何使用Golang实现指针与值类型区别_Golang传值与传引用示例

发布时间 - 2025-12-31 00:00:00    点击率:
Go只有传值,指针传的是地址副本;结构体需传指针才能修改原值;切片/map/channel是含指针的值类型;nil指针解引用会panic;关键在所传值是否指向原始数据。

Go 里没有“传引用”,只有“传值”——但指针变量的值是地址

Go 语言中所有参数传递都是值传递,func f(x int)func f(p *int) 的区别不在于“传引用”或“传值”,而在于你传进去的“值”本身是什么:一个是整数副本,一个是内存地址副本。误以为 Go 支持引用传递,是初学者踩坑最频繁的认知偏差。

修改结构体字段时,为什么传指针才生效?

因为结构体默认按值传递,函数内操作的是副本;传 *struct 后,你拿到的是原结构体地址,解引用 (*s).Field 或简写 s.Field 就能改原始内存。

  • func updateName(u User) { u.Name = "Alice" } → 原 User 不变
  • func updateName(u *User) { u.Name = "Alice" } → 原 UserName 被修改
  • 即使结构体很小(如两个 int),也建议方法接收者用指针——否则调用 u.Method() 会复制整个结构体

切片、map、channel 是“引用类型”?不,它们是含指针的描述符

[]intmap[string]intchan int 本身是值类型,但它们底层结构包含指向底层数组/哈希表/队列的指针。所以:

  • func appendInt(s []int, v int) []int { return append(s, v) } → 必须返回新切片,且调用方要赋值:s = appendInt(s, 5)
  • func setMap(m map[string]int, k string, v int) { m[k] = v } → 不需要返回,因为 m 值里存着指向同一哈希表的指针
  • 但若在函数内做 m = make(map[string]int),外部原 map 不受影响——你只是把那个指针副本重新指向了新地址

常见误用:对 nil 指针解引用 panic

*T 并不保证它非 nil;没初始化的指针变量值是 nil,直接解引用会触发 panic: runtime error: invalid memory address or nil pointer dereference

func printName(u *User) {
    // ❌ 危险!未检查 u 是否为 nil
    fmt.Println(u.Name)

    // ✅ 应先判断
    if u == nil {
        fmt.Println("user is nil")
        return
    }
    fmt.Println(u.Name)
}

接口值(interface{})和指针一样,也可能为 nil;但空接口变量本身非 nil,不代表它装的动态值非 nil —— 这点容易混淆,需格外注意。

真正关键的不是“传值还是传引用”,而是“你传的那个值,是否指向可修改的原始数据”。盯住变量的类型本质(int vs *int vs []int),比记口诀管用得多。


# go  # golang  # app  # 区别  # 为什么  # String  # Error  # 结构体  # int  # 指针  # 接口  # 值类型  # 引用类型  # Struct  # Interface  # 值传递  # 引用传递  # pointer  # 切片  # nil  # append  # map  # channel  # 的是  # 都是  # 原始数据  # 就能  # 不需要  # 而在  # 不代表  # 也可  # 得多  # 不受 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  php 三元运算符实例详细介绍  如何注册花生壳免费域名并搭建个人网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Android使用GridView实现日历的简单功能  如何快速生成凡客建站的专业级图册?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  大连 网站制作,大连天途有线官网?  如何用已有域名快速搭建网站?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何配置和使用缓存?(Redis代码示例)  如何基于云服务器快速搭建个人网站?  如何确认建站备案号应放置的具体位置?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  ,南京靠谱的征婚网站?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  Laravel集合Collection怎么用_Laravel集合常用函数详解  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  网站建设整体流程解析,建站其实很容易!  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  电商网站制作价格怎么算,网上拍卖流程以及规则?  Laravel如何处理异常和错误?(Handler示例)  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  微信小程序 scroll-view组件实现列表页实例代码  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何在服务器上三步完成建站并提升流量?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  网站制作企业,网站的banner和导航栏是指什么?  香港网站服务器数量如何影响SEO优化效果?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程