Pointers 返回golang中的指针
我是Pointers 返回golang中的指针,pointers,go,Pointers,Go,我是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.Print
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函数
获取一个Circle指针
并返回区域。基于此为什么当我打印结构时,它不显示内存地址,而是显示&{1 2 5}
。它使用一个指针作为面积函数,但是c圆
不是作为指针打印的(我想它会打印一个内存地址作为圆指针
)
更新
除非可能&{1 2 5}
实际上是参考
第二次更新
我能让它这样做:
c := Circle{1,2,5}
p := &c
fmt.Printf("%p",p)
// returns 0xc042052340
然而,我现在的问题是,为什么我可以传递
c.area()
而不是p.area()
,因为圆的面积函数需要一个指针:当我们调用一个值为接收器的指针接收器方法时。Go将函数调用c.area()
解释为(&c.area()
)。这种便利是围棋本身提供的。
在规范中,函数调用描述为
如果方法集(类型)为x,则方法调用x.m()有效
包含m,参数列表可以指定给参数列表
m。如果x是可寻址的,并且&x的方法集包含m,x.m()是可寻址的
(&x).m()的速记
这只是
fmt
包的默认行为。如果您使用自定义格式字符串,您可以让它始终打印指针(%p
)。@TimCooper您能回答吗?