(*variable) 和 *&variable,有什么区别?

问题描述 投票:0回答:2

我正在使用 exercism.com 学习围棋,并阅读教学大纲中推荐的文档和文章。

现在我在结构中并找到了下一个代码

package main

import "fmt"

type Employee struct {
  firstName, lastName string
  salary              int
  fullTime            bool
}

func main() {
  employee := &Employee{
    firstName: "Walddys",
    lastName:  "Dorrejo",
    salary:    1200,
    fullTime:  true,
  }
  fmt.Println("firstName", (*employee).firstName)
}

但是由于错误,我输入了

fmt.Println("firstName", *&employee.firstName)
,这给我带来了与之前在代码块中使用的结果相同的结果。

我的问题是,使用这个指针是否存在任何不同或相同?

go pointers struct
2个回答
1
投票

&x
生成指向
x
的指针,而
*p
取消引用指针
p
。如此有效
*
&
相互抵消,例如两个陈述
v := *&x
v := x
是相同的。

这意味着

*&employee.firstName
employee.firstName
相同。

其中

employee
是指向结构的指针,
firstName
是该结构的字段,表达式
employee.firstName
实际上是
(*employee).firstName
的简写。

这意味着

*&employee.firstName
也等同于
(*employee).firstName
.


请注意,您应该始终更喜欢使用速记符号。


1
投票

*&
是冗余语法 - 它获取指向该值的指针,然后取消引用该指针 - 本质上是一个
NOP
.

如果你安装像staticcheck这样的静态分析工具——或者使用像VScode这样的内置静态分析的编辑器——你会得到以下警告:

*&x will be simplified to x. It will not copy x. (SA4001)

https://staticcheck.io/docs/checks#SA4001

© www.soinside.com 2019 - 2024. All rights reserved.