在 Go 中,使用类型参数定义泛型接口可能会导致实施和使用时的推理问题。本文解决了这种情况下的错误“无法推断 V:从约束实现推断类型参数”。
考虑一个带有类型参数 K 和 V 的接口 ConfigStorage,其中 V 扩展了 WritableType 。定义了该接口的文件系统存储实现 FileSystemStorage。然而,当尝试使用泛型函数 GetValue 时,由于无法推断 V 的类型,会出现编译错误。
Go 1.21 及更高版本:
该问题在 Go 1.21 及更高版本中得到解决,因为类型推断已得到增强,可以考虑接口中的方法签名。方法签名中类型参数的类型参数可以从相应方法中的匹配参数中推断出来。
要在不指定类型约束的情况下使用 GetValue:
result, _ = GetValue(fileStorage, "key")
转到 1.20 及更低版本:
对于早期的 Go 版本,不支持从实现约束的类型推断 V。调用 GetValue 时必须提供显式类型参数:
GetValue[string, string](fileStorage, "key")
出现错误是因为函数 GetValue 尝试从提供的参数推断 V 的类型:其第一个参数,存储,及其第二个参数 key。然而,这些参数本身并不能提供足够的信息来确定 V,因为存储是一个可以实现多种类型的接口值。
显式指定类型参数可以消除编译器的歧义。它允许类型推断算法根据提供的参数推断出 V 的正确类型。
以上是如何解决Go通用接口中的'无法推断V:从约束实现推断类型参数”?的详细内容。更多信息请关注PHP中文网其他相关文章!