В Go методы — это функции с receiver (приёмником), указывающим к какому типу метод относится:
type User struct { Name string } func (u *User) SayHello() { fmt.Println("Hi,", u.Name) }
(u *User)) работает как первый аргумент в функцию, но синтаксис и вызовы отличаются.Важно! Объявлять методы можно только для типов, определённых в вашем пакете (no methods on type defined in other package, incl. built-in types). Поведение с алиасами (type alias) — особое:
type MyInt int) — можно добавлять методы.type MyInt = int) — нельзя добавлять методы, потому что это только псевдоним.Пример:
type MyInt int func (m MyInt) Double() int { return int(m) * 2 } // Type alias type MyIntAlias = int // func (m MyIntAlias) Double() int { ... } // ошибка компиляции
Можно ли объявить метод для среза типа []int или для type alias?
Ответ: Для среза встроенного типа ([]int) нельзя объявлять методы. Для нового пользовательского типа на базе среза — можно:
type MySlice []int func (s MySlice) Sum() int { ... } // допустимо
Для type alias нельзя:
type SuperSlice = []int // func (s SuperSlice) Sum() int { ... } // ошибка
История
История
История
При попытке добавить методы к типам из стороннего пакета (например, time.Time) для стандартизации работы с датами выяснилось, что это невозможно в Go — пришлось использовать composition и utility-функции.