如何理解Golang中的指针与值类型_Golang指针与值类型基础-Golang

Go中必须用T而非T仅当需修改原值或T过大(如字段超4个、含切片/map/大数组);基础类型、切片、map、channel无需指针;&仅作用于变量,在声明时为类型修饰符、使用时为解引用;循环中取地址需防复用;函数收*T须首行判nil;指针本质是语义变更而非单纯性能优化。

Go 里的指针不是“C 那种指针”,它只是个存地址的变量,用对了省事,用错了 panic 一下就暴露问题。

什么时候必须用 *T 而不是 T?

只有两个硬性理由:要改原值,或者 T 太大(比如结构体字段超过 4 个、含切片/map/大数组)。

  • 改原值:比如 func (u *User) SetName(name string) —— 不用指针,SetName 改的只是副本,外面完全看不到
  • 避免拷贝:一个含 10KB buffer 的结构体传值,每次调用都复制一次;传 *T 就只传 8 字节地址
  • 基础类型(int、string、bool)几乎从不需要指针——传值快、安全、不用判 nil
  • 切片 []int、map map[string]int、channel 本身已是引用语义,再套一层 *[]int 属于典型画蛇添足

& 和 * 到底在哪儿用?别混淆上下文

& 只能作用于变量,* 在声明和使用时含义完全不同。

  • &x 合法,&42 或 &(a + b) 直接编译报错:字面量和表达式不可取地址
  • var p *int 中的 * 是类型修饰符,表示“指向 int 的指针”
  • *p = 10 中的 * 是解引用操作,此时若 p == nil,运行时 panic
  • p.Name 看似没写 *,但其实是语法糖,等价于 (*p).Name,一样会因 p == nil 崩溃

循环里存 *T 最容易掉进同一个坑

写 for _, name := range names { u := User{Name: name}; m[name] = &u },最后所有 map key 都指向最后一次迭代的 u 地址。

  • 根本原因是:循环变量 u 在栈上复用,每次迭代都覆盖同一内存位置
  • 正确做法是每次构造新对象:m[name] = &User{Name: name} —— Go 逃逸分析会自动把它分配到堆上
  • 同理,[]*User 切片里如果多个元素指向同一个 User{} 实例,改一个就全变,这不是 bug,是预期行为,得看业务要不要共享

函数参数收 *T,第一行就得检查 nil

只要签名是 func doSomething(u *User),调用方就可能传 nil,不检查直接用 u.Name 必 panic。

  • 检查必须放在函数入口:if u == nil { return errors.New("user is required") }
  • 不要推迟到深层逻辑里才判,否则 panic 位置难定位,堆栈也看不出是哪层漏了
  • 如果 nil 是合法的(比如可选配置),参数名要明确,比如 opts *Options,并在文档里写清 “nil means defaults”
  • 返回局部变量的指针?别干——Go 编译器通常能逃逸分析,但语义上不该依赖它;该返回结构体就返回值,该新建就 new(T) 或 &T{}

最常被忽略的点其实是:指针带来的不是性能提升,而是语义变更。你加一个 *,不只是少拷贝,还意味着“这个值可能被别人改”,并发下尤其危险。值类型才是 Go 的默认安全感来源。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何理解Golang中的指针与值类型_Golang指针与值类型基础-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029576+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4029576+
  • 本周更新: 0+
  • 最后更新: 2026-03-16