Возвращение указателя в Голанге - PullRequest
0 голосов
/ 02 июня 2018

Я новичок на 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() вместо p.area(), поскольку функция площади круга требует указателя:

1 Ответ

0 голосов
/ 02 июня 2018

Когда мы вызываем указатель на метод получателя со значением в качестве получателя.Go интерпретирует вызов функции c.area() как (&c).area().Это удобство обеспечивается самим go.В Golang spec это вызов функции описывается как

Вызов метода xm () действителен, если набор методов (тип) xсодержит m и список аргументов можно назначить списку параметров m.Если x адресуемый, а набор методов & x содержит m, xm () является сокращением для (& x) .m ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...