В 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
?
Я ожидаю, что вы получите тип, который ожидает метод. Но почему вы не попробовали это, чтобы увидеть, изменилась структура или нет после того, как вы изменили ее в методе указателя? –
@ ZanLynx Я пробовал, мое наблюдение говорит, ** 1) ** неявный метод указателя получает указанное значение, но не указатель. ** 2) ** метод неявного указателя получает указатель на значение, но не значение. * Это немного запутывает меня, понимая, почему это происходит противоположным образом? Логически это должно быть, как указано в вопросе 1 & 2 * – overexchange
Ниже я рассмотрю ответ от @ dev.bmax как частично неправильный. Отдых принадлежит вам – overexchange