Интерфейс функции в Голанге - PullRequest
0 голосов
/ 16 октября 2018

Рассмотрим такую ​​функцию, которая принимает функцию в качестве аргумента:

func f(arg func(I)){}

, где I - интерфейс.

Есть ли способ передать в вышеприведенную функцию аргумент сигнатуры func(*T)где T реализует I интерфейс.

Теперь, когда я передаю его, у меня появляется ошибка:

cannot use (type func(*T)) as type func(I) in argument

Вот игровая площадка: https://play.golang.org/p/7vilY4zkEzf

Вариант использования следующий:

Я пишу пакет с функцией f(a func(I), b I).Затем пользователь импортирует его как библиотеку.

В качестве следующего шага пользователь определит пользовательский тип T, который реализует интерфейс I, и пользовательскую функцию с подписью func(*T).Затем пользователь вызовет функцию библиотеки f:

f(customFunction, customObject)

В свою очередь, пакет получит ее и создаст программу:

go  customFunction(customObject)

Причина, по которой программы создаются внутри пакетазаключается в том, что оркестровка goroutine должна проводиться "под капотом".

1 Ответ

0 голосов
/ 16 октября 2018

Нет, типы должны быть точными.Ваш пример особенно разбит, потому что I определенно не конвертируется в *T, но он также не будет работать в другом направлении.Если вы уверены , что тип I, передаваемый вашей функции, равен *T, вы можете создать функцию-обертку и передать ее вместо этого.

func wrapper(i I) {
  t := i.(*T)
  myRealFunc(t)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...