当前位置: 首页 > news >正文

GO_复合类型---指针

一、变量的两层含义:内存空间 + 内存地址

Go 中每一个普通变量都包含两层概念:

  1. 变量内存空间:用来存储数值(类比:教室)
  2. 变量地址:内存的编号,通过&变量名获取(类比:教室门牌号)

示例代码

go

package main import "fmt" func main() { var a int a = 10 fmt.Printf("a 的值:%v\n", a) // 内存中存储的值 fmt.Printf("a 的地址:%v\n", &a) // 变量内存地址 }

二、指针类型核心概念

1. 指针的作用

普通变量存储数值,指针变量存储另一个变量的内存地址

2. 指针类型规则

  • *int:int 类型的指针,存储 int 变量的地址
  • **int:二级指针,存储*int指针变量的地址

3. 指针基础语法(取地址、解引用)

  • &变量:取变量的内存地址(赋值给指针)
  • *指针变量:解引用,通过指针操作指向的内存原值

完整示例

go

package main import "fmt" func main() { var a int = 100 // 1. 定义int类型指针 var p *int // 2. 给指针赋值:存储a的地址 p = &a fmt.Printf("a的值:%d\n", a) fmt.Printf("a的地址:%p\n", &a) fmt.Printf("指针p存储的地址:%p\n", p) // 3. 解引用:通过指针修改原变量的值 *p = 555 fmt.Printf("解引用修改后:*p=%d , a=%d\n", *p, a) }

核心结论:修改*p会直接修改原变量a的值,因为二者指向同一块内存空间。


三、Go 指针专属特性(高频考点)

1. 无->操作符

C/C++ 指针访问成员用->Go 语言没有->,统一使用.访问成员,语法统一极简。

2. 禁止操作无合法指向的指针(核心坑点)

声明指针但不赋值,指针默认值为nil,无任何合法内存指向,禁止解引用,会直接报错 panic。

错误示例(绝对禁止)

go

var p *int // p 为 nil,无合法内存,解引用直接崩溃 *p = 100 // panic: runtime error: invalid memory address or nil pointer dereference

正确规则

指针必须指向合法内存空间,才能进行解引用操作


四、new 函数:快速创建合法指针内存

1. new 函数作用

为指定类型T分配一块清零的内存空间,返回该内存的指针地址,保证指针有合法指向。

2. 特性

  • 分配的内存默认零值初始化
  • Go 自动垃圾回收,无需手动释放内存
  • 专门用来解决:指针 nil 非法访问问题

使用示例

go

package main import "fmt" func main() { // 方式1:new创建合法int指针 p := new(int) *p = 666 fmt.Println("*p =", *p) // 方式2:简写 q := new(int) *q = 888 fmt.Println("*q =", *q) }

五、值传递 vs 地址传递(指针核心应用)

Go 语言所有函数参数都是值传递,想要修改原变量,必须传指针(地址传递模拟)。

1. 值传递:无法修改原值

函数内部拷贝变量副本,修改的是副本,原变量不受影响。

go

func swap(a, b int) { // 仅修改副本,外部原值不变 a, b = b, a } func main() { x, y := 10, 20 swap(x, y) fmt.Println(x, y) // 输出:10 20 无变化 }

2. 地址传递(指针传参):修改原值

传递变量地址,函数内部通过指针解引用,直接操作原变量内存,实现原值修改。

go

package main import "fmt" // 接收int指针类型 func swap(p1, p2 *int) { // 解引用交换原值 *p1, *p2 = *p2, *p1 } func main() { a, b := 10, 20 // 传变量地址 swap(&a, &b) fmt.Println(a, b) // 输出:20 10 交换成功 }

六、本章指针核心总结(复习必背)

  1. 变量 = 内存值 + 内存地址,&取地址,*解引用
  2. Go 指针无->,统一使用.访问成员
  3. nil 指针禁止解引用,必须保证合法内存指向
  4. new(T)分配清零内存,返回指针,解决空指针问题
  5. Go 只有值传递,想要改原值必须传指针(地址传递)
  6. 指针核心用途:修改变量原值、避免大内存拷贝
http://www.jsqmd.com/news/1169846/

相关文章:

  • 高压安全隔离技术:ISOM8710与MK51DN512CLQ10应用指南
  • 创业初期的技术招聘策略:如何用股权和愿景吸引优秀工程师
  • 2026全国高压熔断器品牌综合测评与选型分析
  • 2026徐州黄金回收实地实测!市场行情解析+靠谱门店交易全过程复盘 - 微城市网络
  • 劳力士官方保养地址专业售后保养服务权威公示(2026年7月最新) - 劳力士服务中心
  • GTC泽汇资本:把产品理解成本做到位——路径拆解与提示整理
  • 信息学奥赛一本通 1162 题:4 种解法对比与递归思维训练(含复杂度分析)
  • AI代码助手如何重构CI/CD管道?——2024年头部科技公司落地实测数据首次公开(含MTTR下降42%验证报告)
  • GBFR-Logs:碧蓝幻想Relink终极DPS统计工具使用指南
  • STM32锂电池组电压监测与主动均衡系统设计
  • 哪些坑别踩:这 5 类场景现在还不适合上 AI 知识库
  • GO_复合类型---切片
  • 如何统一管理多品牌RGB设备:OpenRGB开源灯光控制完整指南
  • 工业级负载控制方案:TPD2015FN与PIC18F47J53应用解析
  • 面试官:Agent上线后行为失控,你怎么管?我:加规则!他:就这?
  • OpenSSL 3.0 实战:5种常见SSL/TLS握手失败告警的抓包复现与诊断
  • 2026新西兰移民机构推荐榜单 多维度综合排行整理 - 互联网科技品牌测评
  • “敏捷可以响应变化,但变化从来不是免费的”
  • 为什么93%的人用错ChatGPT做健身计划?运动生物力学专家拆解:关节力矩模型缺失、ROM参数未绑定、营养-训练耦合失效(附修正版结构化提示词)
  • NVIDIA Profile Inspector完整指南:解锁显卡隐藏设置的终极免费工具
  • 团队AI编程工具选型指南:从上下文协同到架构推演
  • Unity3D动画文件优化实战:从导入压缩到运行时性能提升
  • Claude Code CLI工业级AI Agent架构与优化实践
  • WPF .NET 6/8 嵌入 WinForm 控件:解决 3 大布局与渲染兼容性问题
  • 2026年7月最新徐州泰格豪雅官方售后热线及客户服务网点地址 - 亨得利官方服务中心
  • GraphRAG索引质量评估 Checklist:小白也能看懂,收藏这份实用指南!
  • 国内环境下的AI图像生成技术实现与合规应用指南
  • Unity卡牌游戏UI框架:数据驱动与模块化设计实践
  • 义乌音品汇汽车音响:解锁汽车音响改装的理想之选,保时捷原厂音响升级/音响改装/宝马原厂音响升级,汽车音响改装旗舰店哪家好 - 音响改装门店分享
  • UE4/UE5项目资产命名规范:提升团队协作效率的黄金标准