我正在使用 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)
,这给我带来了与之前在代码块中使用的结果相同的结果。
我的问题是,使用这个指针是否存在任何不同或相同?
&x
生成指向 x
的指针,而 *p
取消引用指针 p
。如此有效*
和&
相互抵消,例如两个陈述v := *&x
和v := x
是相同的。
这意味着
*&employee.firstName
与employee.firstName
相同。
其中
employee
是指向结构的指针,firstName
是该结构的字段,表达式 employee.firstName
实际上是 (*employee).firstName
的简写。
这意味着
*&employee.firstName
也等同于 (*employee).firstName
.
请注意,您应该始终更喜欢使用速记符号。
*&
是冗余语法 - 它获取指向该值的指针,然后取消引用该指针 - 本质上是一个 NOP
.
如果你安装像staticcheck这样的静态分析工具——或者使用像VScode这样的内置静态分析的编辑器——你会得到以下警告:
*&x will be simplified to x. It will not copy x. (SA4001)