Язык программирования Go: что такое методы

В языке Go мы уже встречали с вами так сказать глобальные функции на подобе:

 
func test() {
}

А как же обстоят дела с методами класса ? Тут все несколько хитрее: во-первых в Go не существует классов в привычном для С++ или Java виде. Вместо классов Go предлагает всего лишь структуру иначе говоря набор полей (привет plain C)

type myType struct{
fld1 string
fld2 int32
}

 

А под методом класса (пардон структуры) выступает «сообщение«, которое может быть послано инстансу определенного типа (рессивер), пример:

func (t myType) test( ) {                                 (1)
}
func (t *myType) test() {                                 (2)
}

И в первом и во втором случае в скобках между func и названием метода мы указываем тип рессивера которому будет послано сообщение, в данном случае это будет тип myType. Важно понимать, что как первое сообщение, так и второе может быть послано как указателю типа myType,  так и value значению типа myType. Отличие первой сигнатуры от второй заключается в том, что в первом случае будет передаваться полная копия перменной, во втором оригинал. Снова поясню на примере:

package main
import "fmt"
type myType struct {

 fld1 string
}
func (t *myType) test() {
 t.fld1 = t.fld1 + " updated"
}
func main() {

 t1 := myType{"t1"}
 t2 := new(myType)
 t2.fld1 = "t2"

 t1.test()
 t2.test()

 fmt.Println(t1.fld1)
 fmt.Println(t2.fld1)
}

Результат выглядит как

t1 updated
t2 updated

Замечу, что переменая t1 это переменная value типа, а переменная t2 это указатель. В случае если бы сигнатура метода выглядела бы как

func (t myType) test() {
 t.fld1 = t.fld1 + " updated"
}

То результат выполнения программы был бы:

t1
t2

Так как в метод test передаются  полные копии (!) value и pointer объектов.

Как мы видим столь привычный нам по C++ полиморфизм в Go просто не работает, указатели используются только для «быстрой» передачи структур большого размера  и речи о таблице(ах) виртуальных функциц вообще не идет. К этому стоит привыкнуть🙂

Интересно а как решается классическая задача любого собеседования «у вас есть коллекция геометрических фигур; какую иерархию классов Вы бы предложили чтобы реализовать отрисовку фигур, принадлежащих коллекции ?!». Наверное надо использовать interface, но это вопрос уже следующей статьи🙂

Отмечено

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: