Все вопросы

26 Свои типы

Чем метод отличается от функции?

У метода есть получатель — значение, на котором его вызывают. Получатель по значению работает с копией, получатель-указатель меняет оригинал. Если переменная адресуема, Go сам берёт адрес: у c := Counter{} вызов c.Inc() означает (&c).Inc().

Набор методов у T и *T разный. Методы с получателем-указателем входят в набор *T, но не в набор T. Поэтому интерфейс, который требует Inc(), выполнит *Counter, а не Counter, если Inc объявлен на указателе.

Получатель — обычное имя, чаще одна-две буквы от типа: c Counter, u User. this и self в Go не используют.

Пример

Go

Value читает копию, Inc меняет оригинал

package main

import "fmt"

type Counter struct {
    N int
}

func (c Counter) Value() int { return c.N }

func (c *Counter) Inc() { c.N++ }

func main() {
    c := Counter{N: 1}
    c.Inc()
    fmt.Println(c.Value())
}