В Go нет классов, но вы можете определять методы для типов.
Вы можете определить методы для любого типа, объявленного в определении типа.
Метод - это функция с дополнительным аргументом получателя. Получатель находится между ключевым словом func и именем метода. В следующем примере метод HasGarage связан с типом House. Получатель метода назван p.
type House struct {
garage bool
}
func (p *House) HasGarage() bool { return p.garage }
func main() {
house := new(House)
fmt.Println(house.HasGarage()) // Печатает "false" (нулевое значение)
}
Преобразования и методы
Если вы преобразуете значение в другой тип, новое значение будет иметь методы нового типа, но не старого.
type MyInt int
func (m MyInt) Positive() bool { return m > 0 }
func main() {
var m MyInt = 2
m = m * m // Операторы базового типа все еще применяются.
fmt.Println(m.Positive()) // Печатает "true"
fmt.Println(MyInt(3).Positive()) // Печатает "true"
var n int
n = int(m) // Требуется преобразование.
n = m // Недопустимо
}
../main.go:14:4: cannot use m (type MyInt) as type int in assignment
В Go идиоматично преобразовывать тип выражения для доступа к определенному методу.
var n int64 = 12345
fmt.Println(n) // 12345
fmt.Println(time.Duration(n)) // 12.345µs
(Основной тип time.Duration - int64, а тип time.Duration имеет метод String, который возвращает продолжительность, отформатированную как время.)
Читайте также:
- Основы Go: методы, получатели и указатели
- Объектно-ориентированное программирование с наследованием в Golang
- Go FAQ: Почему в Go нет объявлений "implements"?
Комментариев нет:
Отправить комментарий