пятница, 26 июля 2019 г.

ООП в Golang: методы не для классов, но для типов

В 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, который возвращает продолжительность, отформатированную как время.)


Читайте также:


Комментариев нет:

Отправить комментарий