26 Свои типы
Чем метод отличается от функции?
Ответ
У метода есть получатель — значение, на котором его вызывают. Получатель по значению работает с копией, получатель-указатель меняет оригинал. Если переменная адресуема, Go сам берёт адрес: у c := Counter{} вызов c.Inc() означает (&c).Inc().
Подробнее
Набор методов у T и *T разный. Методы с получателем-указателем входят в набор *T, но не в набор T. Поэтому интерфейс, который требует Inc(), выполнит *Counter, а не Counter, если Inc объявлен на указателе.
Получатель — обычное имя, чаще одна-две буквы от типа: c Counter, u User. this и self в Go не используют.
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())
}