Golang泛型 - 方法无法编译的问题
Golang泛型 - 方法无法编译的问题 以下代码可以正常工作:
func addThem[N int](a N, b N) N{
c := a + b
return c
}
但以下代码无法编译:
func (c Client) FindAllTransactions[S any](dbUniqueIdentifier database.DBUniqueIdentifier, schema S) (interface{}, error)...
错误信息为:interface method must have no type parameters
我已安装了最新版本的 Go。
更多关于Golang泛型 - 方法无法编译的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
我必须说,我不理解为什么他们不支持接口函数的泛型。这看起来非常不一致。但我想这就是生活吧。必须尝试使用接口和反射来实现。
更多关于Golang泛型 - 方法无法编译的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我发现,你可以将多类型参数功能从接口或结构中提取出来,创建一个接受泛型接口或结构的多类型参数函数。
实际上,你的帖子指出了GoLang中泛型的一个实际问题,我很想看到一些真正有效的解决方案。
rschluet:
我不明白为什么
如果你没看到的话,这里提到了几个实现上的困难:类型参数提案
根据类型参数提案,不允许在方法中定义类型参数。
这一限制阻碍了定义函数式流处理原语,例如:
func (si *stream[IN]) Map[OUT any](f func(IN) OUT) stream[OUT]
虽然我同意这些函数式流可能效率不高,并且 Go 的设计初衷并非涵盖此类用例,但我想强调的是,Go 在流处理管道(例如 Kafka)中的应用已成为事实。允许在方法中使用类型参数将有助于构建领域特定语言,从而极大地简化某些现有用例。
其他可能受益于方法中类型参数的潜在用例包括:
- 测试领域特定语言:
Assert(actual).ToBe(expected) - 模拟领域特定语言:
On(obj.Sum).WithArgs(7, 8).ThenReturn(15)
这是一个Go语言泛型方法的正确性问题。第一个示例是普通函数,第二个示例是方法。在Go中,方法不能有自己的类型参数,只有类型本身可以有类型参数。
正确做法是将类型参数移到接收器类型上:
// 定义泛型类型
type Client[S any] struct {
// 字段定义
}
// 方法使用接收器类型的类型参数
func (c Client[S]) FindAllTransactions(dbUniqueIdentifier database.DBUniqueIdentifier, schema S) (interface{}, error) {
// 实现代码
return nil, nil
}
或者,如果不想让Client成为泛型类型,可以将类型参数移到方法参数中:
func (c Client) FindAllTransactions[S any](dbUniqueIdentifier database.DBUniqueIdentifier, schema S) (interface{}, error) {
// 实现代码
return nil, nil
}
但注意:第二种方式在Go 1.18+中仍然不被允许,因为方法不能有独立的类型参数。必须将类型参数放在接收器类型上。
使用示例:
type TransactionSchema struct {
ID int
Data string
}
func main() {
client := Client[TransactionSchema]{}
result, err := client.FindAllTransactions(someDBIdentifier, TransactionSchema{})
// 处理结果
}
这是Go语言设计上的限制:类型参数只能出现在类型声明或函数声明中,不能出现在方法声明中独立于接收器类型。

