news 2026/8/7 14:18:48

Go 语言指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go 语言指针

Go 里的指针不复杂,但非常实用,不像 C/C++ 那么危险,也不像 Java 那样完全看不到。

一、Go 指针是什么

1. 指针的本质

指针 = 变量的内存地址

var a int = 10 var p *int = &a
  • a:值是10

  • &a:a 的地址

  • p:指向a的指针

  • *p:通过指针访问a的值

fmt.Println(a) // 10 fmt.Println(p) // 0xc00001a0a8(地址) fmt.Println(*p) // 10

口诀:
& 取地址,解引用*

2. Go 指针的“安全边界”

和 C/C++ 不同,Go:

  • 不能指针运算(p++不存在)

  • 不能随便转类型

  • 有 GC(不用手动 free)

  • 空指针是nil

var p *int fmt.Println(p == nil) // true

二、Go 指针使用场景

1. 修改函数外的变量(非常核心)

❌ 值传递(改不到外面):

func add(a int) { a++ } func main() { x := 10 add(x) fmt.Println(x) // 10 }

✅ 指针传递:

func add(a *int) { *a++ } func main() { x := 10 add(&x) fmt.Println(x) // 11 }

Go 只有值传递,但“指针的值”可以指向同一块内存

2 结构体 + 指针(Go 的高频用法)

type User struct { Name string Age int } func grow(u *User) { u.Age++ } func main() { u := User{Name: "Tom", Age: 18} grow(&u) fmt.Println(u.Age) // 19 }

注意: Go 一个很贴心的地方:

u.Age++ // 等价于 (*u).Age++

Go 自动帮解引用,不需要满屏*

3. new / & 的区别

p1 := new(int) // *int,值是 0 p2 := &User{} // *User

等价写法:

var a int p := &a

一般习惯:

  • 基本类型:&

  • 结构体:&User{}或构造函数

三、Go 指针的核心使用场景

场景 1:需要修改对象本身(最常见)

func updateName(u *User) { u.Name = "Jack" }

场景 2:避免大对象拷贝(性能 & 内存)

type BigStruct struct { Data [100000]int } func process(b *BigStruct) { // 不拷贝 100000 个 int }

场景 3:区分“没传”和“传了零值”

这个在 API / JSON / DB 特别重要

type Req struct { Age *int `json:"age"` }
  • nil→ 前端没传

  • 0→ 前端明确传了 0

场景 4:方法接收者用指针(Go 面向对象)

func (u *User) Grow() { u.Age++ }

什么时候用指针接收者?

  • 需要修改对象

  • 结构体比较大

  • 保证方法一致性(推荐)

官方建议:一个结构体,要么全指针接收者,要么全值接收者

场景 5:与 interface 配合

type Writer interface { Write() } type File struct{} func (f *File) Write() {} var w Writer w = &File{} // 正确

这样不行,因为方法在*File上:

w = File{} // 没实现接口

场景 6:并发 & 共享状态

需谨慎使用

var count int var mu sync.Mutex func inc() { mu.Lock() count++ mu.Unlock() }

虽然不是“显式指针”,但底层都是共享内存 + 地址

四、Go 指针 vs Java/C++

对比GoJavaC++
手动内存
指针运算
空指针nilnullnullptr
参数传递值传递值传递(引用语义)值/引用

Go 指针 = “受控版 C 指针 + Java 引用的灵活性”

五、新手常见坑

❌ 对 map / slice 再取指针

func f(m *map[string]int) // 一般没必要

因为:

  • map / slice 本身就是“引用类型”

  • 直接传就能改

❌ nil 指针解引用

var u *User u.Age = 10 // panic

一定要先初始化。

六、总结

Go 指针的目标只有三个:

  1. 修改原数据

  2. 减少拷贝

  3. 表达“可选值”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/7 21:41:43

桌面那么点大,性能它偏要狂

AI 基建遍地开花,内存带宽“饭量”暴增,可传统产能却在偷偷“减肥”。于是 DRAM 价格一路高歌——“涨”声响起,根本停不下来!科技巨头们囤货如囤年货,闪存和内存条顿时成了超市里的限量薯片,货架越来越空。…

作者头像 李华
网站建设 2026/8/7 21:42:01

基于51单片机的智能水表系统设计

基于51单片机的智能水表系统设计 一、系统设计背景与需求分析 传统机械水表依赖人工抄表,存在效率低下、数据误差大、抄表周期长等问题,尤其在高层住宅、老旧小区中,人工入户抄表不仅耗费人力,还易引发用户隐私纠纷。此外&#xf…

作者头像 李华
网站建设 2026/8/7 22:27:20

基于单片机的交通控制系统

第一章 系统整体架构设计 基于单片机的交通控制系统,核心目标是实现路口交通信号灯的精准控制与车流自适应调节,整体架构分为核心控制模块、信号灯驱动模块、车流检测模块、人机交互模块四大单元。核心控制模块以单片机为核心,负责处理车流数…

作者头像 李华
网站建设 2026/8/6 10:12:14

永磁同步电机PMSM 5 - 7次谐波注入降低转矩脉动实践

永磁同步电机PMSM电机5 -7次谐波注入降低转矩脉动(参考文献搭建) ①控制思路:以抑制电机电流中较大的 5、7 次谐波分量为目的,实时 提取谐波电流,注入谐波电压来补偿抵消电机运行时电机电流中的谐波,通过抑…

作者头像 李华
网站建设 2026/8/7 11:33:46

万字长文梳理如何扩展大语言模型的上下文长度:算法原理、实现方法与适用场景(RoPE、YaRN、优化Attention、RAG等)

万字长文梳理如何扩展大语言模型的上下文长度:算法原理、实现方法与适用场景(RoPE、YaRN、优化Attention、RAG等) 原创 功夫熊猫 熊猫AI自习室 2025年12月15日 14:01 在大模型应用或者智能体应用开发中(比如智能客服、办公助手、…

作者头像 李华
网站建设 2026/8/7 2:13:46

特征提取+概率神经网络 PNN 的轴承信号故障诊断模型

往期精彩内容: Python轴承故障诊断 (14)高创新故障识别模型-CSDN博客 独家原创 | SCI 1区 高创新轴承故障诊断模型!-CSDN博客 基于 GADFSwin-CNN-GAM 的高创新轴承故障诊断模型-CSDN博客 Python轴承故障诊断 (19)基于Transformer-BiLSTM的创新诊断模…

作者头像 李华