Общая функция, не может быть определена в виде анонимной?

например:

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 не позволяет анонимной функции быть универсальной?

Из учебника go genericsWhile 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.

colm.anseo 03.04.2023 03:47
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функциональный литерал не может быть универсальным, потому что функциональный литерал создает значение функции, а значение функции не может быть универсальным. Точно так же, если у вас есть универсальная функция, вы не можете использовать ее в качестве значения функции. Например

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; они всего лишь синтаксический инструмент для создания экземпляров функций с подстановкой типов.

Другие вопросы по теме