А что вы хотите сделать? Какую проблему решаете? Потому что способы сложить эти функции в слайс есть, но при имспользовании всё равно придётся выводить типы. По-моему, и проще и лучше будет использовать функции напрямую, а вызывать нужную из них через switch в зависимости от типа аргумента
func wrapper[A, B, C any](f func(B) C, g func(A) B) func(A) C {
return func(x A) C {
return f(g(x))
}
}
На просторах нашел reduce:
func Reduce[T1, T2 any](s []T1, accumulator T2, f func(T2, T1) T2) T2 {
r := accumulator
for _, v := range s {
r = f(r, v)
}
return r
}
Но эта функция требует чтобы айтемы в слайсе были с однородным типом, пытался передавать s []interface{},
и ловил type assertion, как сказал Telcontar, то есть необходимо приводить функцию к конкретной сигнатуре.
to_east, вы пытаетесь выжать из Го уровень абстракций, для которого этот язык не предназначен. Даже если получится, использовать это будет очень больно.
Рекомендую использовать более простые подходы.
to_east, Не пытайтесь писать на Питоне в Go :)
Вы снова не пишете. КАКУЮ проблему решаете, а пишете, КАК вы решаете эту загадочную проблему. Точнее, как бы вы решали эту проблему на Питоне.
Go - это язык, который по рукам бьёт за излишнее усложнение. Проблема Питона в том, что там стандартные языковые конструкции гораздо медленнее, чем библиотечные функциональные штучки. Я даже помню рекомендацию никогда не использовать цикл for на питоне, потому что он тормознутый как черепаха.
В Go же, наоборот, приветствуется использование самых простых базовых конструкций языка над всякой хитрой функциональщиной, потому что циклы в Go просто молниеносные.
Используйте просто цикл, просто if или switch и вы увидите, что код стал намного понятнее. Поймите, вам на самом деле не нужно использовать редьюсер, чтобы получить требуемую функцию из коллекции функций, а вам нужно решить какую-то конкретную задачу бизнеса: из каких-то данных на входе получить какие-то данные на выходе.