无法推断 V:从约束实现解析推断类型参数
目标是在 Go 中创建一个支持保存和加载结果的接口在不同的数据库中,同时支持各种数据类型。
type WritableType interface { ~int | ~string | ~float64 } type ConfigStorage[K, V WritableType] interface { get(key K) (V, error) set(key K, value V) (bool, error) }
实现文件时出现问题系统存储:
type FileSystemStorage[K, V WritableType] struct { } func (f FileSystemStorage[K, V]) get(key K) (V, error) { // Code to load data from JSON file } func (f FileSystemStorage[K, V]) set(key K, value V) (bool, error) { // Code to save data as JSON file }
调用SetValue时,成功。但是,在调用 GetValue 时,编译器会遇到错误:
cannot infer V
解决方案
对于 Go 1.21 及以上版本:
在 Go 1.21 中,类型推断得到了改进,可以考虑接口方法中使用的类型。因此,您现在可以在不指定类型参数的情况下调用 GetValue:
result, _ = GetValue(fileStorage, "key")
对于 Go 1.20 及以下版本:
由于当前类型推断算法不允许推断V 从约束实现中,调用 GetValue 时必须提供显式类型参数:
GetValue[string, string](fileStorage, "key")
以上是如何解决 Go 在通用接口中使用类型约束时出现'Cannot Infer V”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!