首页 > 文章列表 > 不允许使用匿名形式定义泛型函数吗?

不允许使用匿名形式定义泛型函数吗?

214 2024-11-07
问题内容

例如:

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 出现错误,它显示:

Function literal cannot have type parameters

那么,为什么 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 类型系统中的类型;它们只是用于通过类型替换实例化函数的语法工具。