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

Сегодня расскажу об одной интересной, покрайней мере для меня, особенности языка Go как тип даных func.  Данный тип во многом похож на те же указатели на функции в С++.  И так начнем с примера:

package main
import "fmt"
type MyFunc func (arg string)
/** method of MyFunc type*/
func myFunc1(arg string){
 fmt.Println("myFunc1: " + arg)
}
/** method to test MyFunc type*/
func test(f MyFunc){
 /** simply call MyFunc method*/
 f("test")
}
func main() {
 /** declare anonymous method*/
 f := func (arg string){
 fmt.Print("Anonymous: " + arg)
 }

 /** test*/
 test(myFunc1)
 /** test anonymous*/
 test(f)
}
Result:
myFunc1: test
Anonymous: test

Разберем пример по частя,  хотя думаю код говорит сам за себя🙂

Объявляем func тип как метод принимающий только один аргумент типа string

type MyFunc func (arg string)

Далее пишем test case для перемнных типа MyFunc — по сути происходит простой вызов метода

/** method to test MyFunc type*/
func test(f MyFunc){
 /** simply call MyFunc method*/
 f("test")
}

Далее «явно объявлем инстанс» типа MyFunc

/** method of MyFunc type*/
func myFunc1(arg string){
 fmt.Println("myFunc1: " + arg)
}

А также создаем и «анонимный инстанс»

 /** declare anonymous method*/
 f := func (arg string){
 fmt.Print("Anonymous: " + arg)
 }

Ну и под конец вызов test case’a для явно и анонимно определенной функции.

А теперь основной вопрос: «А зачем все это нужно ?!». Для себя я нашел следующие области примения типа func:

  • Реализация функторов, в Java это что-то сродни java.util.Comparator<T>
  • CallBack в том случае если использования интерфейса для этих целей не разумно.
Отмечено

7 ответов на “Язык программирования Go: тип данных func

  1. А почему в разделе «Далее “явно объявлем инстанс” типа MyFunc» нигде не указывается что тип MyFunc?
    Я бы ожидал что-то вроде:

    MyFunc myFunc1(arg string){ … }

    Или это duck typing?

  2. Я так понимаю там где-то еще тип возвращаемого значения должен фигурировать, но он опущен в данном случае, да?

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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