通用函数,无法以匿名形式定义?

3

e.g:

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 不允许匿名函数是泛型的呢?


2
go泛型教程中得知,"虽然类型参数的约束通常代表一组类型,但在编译时,类型参数代表单个类型——由调用代码提供为类型参数的类型。"。按照定义,字面值必须在编译时具有所有类型和值。如果需要运行时灵活性,则使用具体类型“any”定义参数类型。 - colm.anseo
1个回答

5

函数字面量不能是泛型的,因为函数字面量会产生一个函数值,而函数值不能是泛型的。同样地,如果您有一个泛型函数,您也不能将其用作函数值。例如:

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类型系统中的一种类型;它们只是一种语法工具,用于实例化带有类型替换的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接