我是/include/
的初学者,但我有一个问题:
我有以下代码:
go
我的问题是,package lab
import (
"fmt"
"math"
)
type Circle struct {
x float64
y float64
r float64
}
func (c *Circle) area() float64 {
return math.Pi * c.r * c.r
}
func StructCode() {
c := Circle{1,2,5}
fmt.Println("struct addr",c)
fmt.Println("Circle",c.area())
}
需要Circle area function
并返回该区域。基于此。 为什么当我打印结构时它不显示内存地址,但显示Circle Pointer
而不是。它需要一个区域函数的指针,但&{1 2 5}
不打印为指针(我想它会打印一个内存地址为c circle
)
更新
除非可能circle pointer
实际上是参考?
第二次更新
我能够做到这一点:
&{1 2 5}
但我现在的问题是,为什么我可以通过c := Circle{1,2,5}
p := &c
fmt.Printf("%p",p)
// returns 0xc042052340
代替c.area()
,因为circle的区域函数需要指针:
答案 0 :(得分:1)
当我们将值为接收器的指针接收器方法调用时。 Go将函数调用c.area()
解释为(&c).area()
。这种便利是由go本身提供的。
在Golang规范中,函数调用被描述为
方法调用 x.m()如果方法集(类型)x有效 包含m,参数列表可以分配给参数列表 米如果x是可寻址的并且& x的方法集包含m,则 x.m()是 (& x).m()
的简写