为什么取消对地址的引用会在 Golang 中"invalid indirect"错误?


type person struct{
Name string
Age int
}
// parameters : (pointer to person struct), which is basically address of person object
func printPerson(p *person) {
// when we add '*' to a address, then it becomes dereferencing, Hence 
// I read "*p.Name" as "person object dot Name" and i expect it to give value,
// I get this error:
// ./prog.go:20:15: invalid indirect of p.Name (type string)
// ./prog.go:20:24: invalid indirect of p.Age (type int)
fmt.Println(*p.Name, *p.Age) // does not works, ERROR THROWN
// But this works perfectly
// I read it as "person address dot name and person address dot age"
// for me it does not make sense when we say "address dot field name", 
// shouldn't it be "object dot field name ? "
fmt.Println(p.Name, p.Age)
}
func main() {
p := person{"foobar", 23}
printPerson(&p) // we are sending address to the method
}

为什么我们不能执行取消引用的对象点域名称而不是地址点域名称?请阅读代码注释进行问题解释,我在这里缺少什么?

p.Namep.Age按原样工作,因为如果p是指向结构的指针,那么p.Name就是(*p).Name的简写。引用规范:选择器:

在表达式x.f[…]中,如果x的类型是定义的指针类型,而(*x).f是表示字段(而不是方法(的有效选择器表达式,则x.f(*x).f的简写。

鉴于此,*p.Name不尝试取消引用p并引用Name字段,而是尝试取消引用不是指针的p.Name字段。

如果您使用括号对间接寻址进行分组,它会起作用:

fmt.Println((*p).Name, (*p).Age)

但是,由于这种形式非常频繁,Spec允许您省略指针间接寻址,只需编写p.Name

在Go中,&运算符用作指向变量的指针,并将其地址保存在内存中。*可用于"取消引用"此类指针。取消引用指针可以让我们访问指针指向的值。

在您的示例中,当函数接收到参数&p(指向变量p的指针(时,您可以直接更改其值,因为结构体"person"的成员nameage不是指针(*T(。

在这种情况下,您要将结构体person的成员更改为指针类型(如下面的示例(,它将打印到控制台:指针值(内存地址(以及它们所指向的varfoobarage的值。

type person struct {
Name *string // Pointer of type string
Age  *int // Pointer of type int
}
func printPerson(p *person) {
fmt.Println(p.Name, p.Age) // Pointer values (the memory addresses)
fmt.Println(*p.Name, *p.Age) // Dereferenced values (foobar, 23)
}
func main() {
name := "foobar"
age := 23
p := person{&name, &age}
printPerson(&p)
}

相关内容

  • 没有找到相关文章

最新更新