например:
func f[T any](t T) T {
var result T
return result
}
// this got error !
var fAnonymous = func[T any](t T) T {
var result T
return result
}
fAnonymous
получил ошибку, пишет:
Функциональный литерал не может иметь параметры типа
Итак, почему golang не позволяет анонимной функции быть универсальной?
Функциональный литерал не может быть универсальным, потому что функциональный литерал создает значение функции, а значение функции не может быть универсальным. Точно так же, если у вас есть универсальная функция, вы не можете использовать ее в качестве значения функции. Например
func RegularFunction() {}
func GenericFunction[T any]() {}
func main() {
// fine, since regular function can act as a value
var f1 func() = RegularFunction
// not valid, since a generic function is not a function value
// Error: "cannot use generic function GenericFunction without instantiation"
var f2 func() = GenericFunction
// fine, since the generic function has been instantiated
var f3 func() = GenericFunction[int]
}
Другими словами:
// vvvvvvvvvvvvv this is the type of normalFunc
var normalFunc func(int) int = func(i int) int {
return i + 1
}
// vvvvvv what type would go here?
var genericFunc = func[T any](t T) T {
var result T
return result
}
Переменной fAnonymous
здесь нельзя присвоить какой-либо тип. Универсальные функции не являются типом в системе типов Go; они всего лишь синтаксический инструмент для создания экземпляров функций с подстановкой типов.
Из учебника go generics
While a type parameter’s constraint typically represents a set of types, at compile time the type parameter stands for a single type – the type provided as a type argument by the calling code.
. Литеральное значение по определению должно иметь все типы и значения, известные во время компиляции. Если вам нужна гибкость во время выполнения, определите тип аргумента с конкретным типомany
.