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您能回答吗?