如何使用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" }→ 原User的Name被修改 - 即使结构体很小(如两个
int),也建议方法接收者用指针——否则调用u.Method()会复制整个结构体
切片、map、channel 是“引用类型”?不,它们是含指针的描述符
[]int、map[string]int、chan 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解耦应用的实战教程

