Является ли объявление функции в Голанге строгим? - PullRequest
0 голосов
/ 17 декабря 2018

Почему этот код работает?Функция Introduce() принимает указатель на Person, но когда мы создаем p - это объект (не указатель).Так что объявление функции не строгое?

package main

import "fmt"

type Person struct {
    Name string
}

func (p *Person) Introduce() {
    fmt.Printf("Hi, I'm %s\n", p.Name)
}

func main() {

    p := Person{Name: "Fedya"}
    fmt.Println(p)
    p.Introduce()

    p1 := &Person{Name: "Fedya"}
    fmt.Println(p1)
    p1.Introduce()

}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Go func s, которые принимают объект receive (заключенный в круглые скобки), не следует путать с методами класса, которые распространены в языках ООП.Независимо от того, определяете ли вы свой экземпляр как указатель или нет, когда приёмник является указателем, Go передаст ваш экземпляр как указатель на func.

PS Вы даже можете вызвать этоfunc с приемником nil как:

var p *Persion  // p == nil
p.Introduce()   // Compiler: OK!
0 голосов
/ 17 декабря 2018

Согласно спецификации :

Набор методов любого другого типа T состоит из всех методов, объявленных с типом получателя T. Набор методов соответствующего типа указателя * Tявляется набором всех методов, объявленных с приемником * T или T (то есть, он также содержит набор методов T).

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