Go语言 (*variable)和 *&variable有什么区别?

fnvucqvd  于 2023-03-27  发布在  Go
关注(0)|答案(2)|浏览(168)

我正在使用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),这给我带来了与前面在代码块中使用的相同的结果。
我的问题是,如果存在任何不同的使用这个指针或相同?

bgibtngc

bgibtngc1#

&x生成指向x的指针,而*p解引用指针p。因此,*&实际上相互抵消,例如两个语句v := *&xv := x是相同的。
这意味着*&employee.firstNameemployee.firstName相同。
其中employee是指向结构体的指针,firstName是该结构体的字段,表达式employee.firstName实际上是(*employee).firstName的简写。
这意味着*&employee.firstName也与(*employee).firstName相同。
请注意,您应该始终倾向于使用速记符号。

x3naxklr

x3naxklr2#

*&是冗余语法-它获取指向值的指针,然后解引用指针-本质上是NOP
如果你安装了像staticcheck这样的静态分析工具,或者使用像VScode这样的内置静态分析的编辑器,你会得到以下警告:

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

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

相关问题