我正在使用www.example.com学习GOexercism.com,并阅读教学大纲中推荐的文档和文章。
现在我在struct中找到了下一个代码
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)
,这给我带来了与前面在代码块中使用的相同的结果。
我的问题是,如果存在任何不同的使用这个指针或相同?
2条答案
按热度按时间bgibtngc1#
&x
生成指向x
的指针,而*p
解引用指针p
。因此,*
和&
实际上相互抵消,例如两个语句v := *&x
和v := x
是相同的。这意味着
*&employee.firstName
与employee.firstName
相同。其中
employee
是指向结构体的指针,firstName
是该结构体的字段,表达式employee.firstName
实际上是(*employee).firstName
的简写。这意味着
*&employee.firstName
也与(*employee).firstName
相同。请注意,您应该始终倾向于使用速记符号。
x3naxklr2#
*&
是冗余语法-它获取指向值的指针,然后解引用指针-本质上是NOP
。如果你安装了像staticcheck这样的静态分析工具,或者使用像VScode这样的内置静态分析的编辑器,你会得到以下警告:
https://staticcheck.io/docs/checks#SA4001