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
相关产品推荐
相关产品推荐

