2017-01-29 8 views
0

В GO, я узнал, что,GO - Как работает неявный метод?

1)

Программист может определить только методы названных типов (X) или указатель (*X) именованным типов

2)

Явное определение метода для типа X неявно определяет тот же метод для типа *X и наоборот, поэтому, Андинг есть, если я заявляю,

func (c Cat) foo(){ 
    //do stuff_ 
} 

и объявить,

func (c *Cat) foo(){ 
    // do stuff_ 
} 

затем GO компилятор дает,

Compile error: method re-declared

, который указывает на то, что метод указатель неявно определяется и вице %


С данным именем типа (Cat),

type Cat struct{ 
    Name string 
    Age int 
    Children []Cat 
    Mother *Cat 
} 

Сценарий 1

Метод (foo) определяется на названном типа (Cat), b у программиста,

func (c Cat) foo(){ 
    // do stuff.... 
} 

, который неявно определяет метод (foo) на указателе (*Cat) к указанному типу, Г.О. компилятор, который выглядит как,

func (c *Cat) foo(){ 
    // do stuff.... 
} 

О создании переменных с именем типа (Cat)

var c Cat 
var p *Cat = &c 

c.foo() имеет метод, определенный программистом.

Вопрос 1:

На вызове p.foo(), делает метод неявного указателя получить указатель (p)?


Сценарий 2

Метод (foo), определенная на указатель (*Cat) к указанному типу, программистом,

func (c *Cat) foo(){ 
    // do stuff.... 
    } 

, который неявно определяет метод (foo) по именованному типу (Cat), компилятором GO, который выглядит как,

func (c Cat) foo(){ 
    // do stuff.... 
    } 

по созданию переменных с именем типа (Cat)

var c Cat 
var p *Cat = &c 

p.foo() имеет метод, определенный программистом (выше).

Вопрос 2:

На вызове c.foo(), это неявный метод не указка получить значение c?

+0

Я ожидаю, что вы получите тип, который ожидает метод. Но почему вы не попробовали это, чтобы увидеть, изменилась структура или нет после того, как вы изменили ее в методе указателя? –

+0

@ ZanLynx Я пробовал, мое наблюдение говорит, ** 1) ** неявный метод указателя получает указанное значение, но не указатель. ** 2) ** метод неявного указателя получает указатель на значение, но не значение. * Это немного запутывает меня, понимая, почему это происходит противоположным образом? Логически это должно быть, как указано в вопросе 1 & 2 * – overexchange

+0

Ниже я рассмотрю ответ от @ dev.bmax как частично неправильный. Отдых принадлежит вам – overexchange

ответ

5
  1. An explicit method definition for type X implicitly defines the same method for type *X and vice versa.

Это не правильно. Методы не определены неявно. Единственное, что делает компилятор для вас, - это неявно заменить c.foo() на (*c).foo() или c.foo() с (&c).foo() для удобства. См. tour of Go

  1. Получатель метода имеет тип T или тип * T, основанный на вашем явном объявлении.
+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/134311/discussion-on-answer-by-dev-bmax-go-how-does-an-implicit-method-work) , –