На этом шаге рассмотрим методы-выражения в Go.
Методы-выражения, как и функции, можно передавать и присваивать переменным. Метод-выражение – это функция, принимающая в первом аргументе значение типа, которому данный метод принадлежит.
/*Cоздаются четыре метода-выражения: asStringV(), принимающий значение типа Part в единственном аргументе, hasPrefix(), принимающий значение типа Part в первом аргументе и строку – во втором, и методы asStringP() и lower(), оба принимающие указатель типа *Part в виде единственного аргумента*/ asStringV := Part.String // Фактическая сигнатура: func(Part) string sv := asStringV(part) hasPrefix := Part.HasPrefix // Фактическая сигнатура: func(Part, string) bool asStringP := (*Part).String // Фактическая сигнатура: func(*Part) string sp := asStringP(&part) lower := (*Part).LowerCase // Фактическая сигнатура: func(*Part) lower(&part) fmt.Println(sv, sp, hasPrefix(part, "w"), part)
Архив с примерами можно взять здесь.
Методы-выражения являются дополнительной особенностью, которая может пригодиться в необычных ситуациях.
Все пользовательские типы, созданные в предыдущих шагах, не имеют механизма, гарантирующего допустимость данных, которыми инициализируются поля, и не имеют механизма, гарантирующего, что значению типа не будут присвоены недопустимые данные.
Например, полям Part.Id и Part.Name могут быть присвоены любые значения.
На следующем шаге рассмотрим типы с проверкой в Go.