You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中(*variable)与*&variable的用法差异是什么?

Go语言中(*employee).firstName与*&employee.firstName的差异分析

先拆解两种写法的执行逻辑:

1. (*employee).firstName的执行逻辑

employee是指向Employee结构体的指针,这里显式对指针解引用,得到完整的Employee结构体实例,再直接访问它的firstName字段。这是Go语言中通过指针访问结构体字段的标准写法之一(更常用的简化写法是employee.firstName,编译器会自动帮你完成解引用)。

2. *&employee.firstName的执行逻辑

这里是三步冗余操作的组合:

  • 第一步employee.firstName:借助Go的语法糖,编译器自动转换为(*employee).firstName,直接拿到firstName的字符串值;
  • 第二步&employee.firstName:对这个字符串值取地址,得到*string类型的指针;
  • 第三步*&employee.firstName:对*string指针解引用,回到原来的字符串值。

两者的核心区别与结果说明

  • 最终输出结果一致:两条路径最终都获取到firstName字段的实际值,所以fmt.Println的输出完全相同。
  • 执行逻辑存在差异:前者是直接操作结构体指针与解引用,后者多了「取地址→解引用」的冗余步骤;不过Go编译器会自动优化这类无意义的冗余操作,最终生成的机器码可能没有区别。
  • 可读性与规范度不同:(*employee).firstName(或更简洁的employee.firstName)是符合Go开发规范的常规写法,而*&employee.firstName属于冗余写法,既无必要,还会降低代码可读性,实际开发中不推荐使用。

内容的提问来源于stack exchange,提问作者Walddys E. Dorrejo Céspedes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:50:16