首页 >后端开发 >Golang >如何解决 Go 在通用接口中使用类型约束时出现'Cannot Infer V”错误?

如何解决 Go 在通用接口中使用类型约束时出现'Cannot Infer V”错误?

Patricia Arquette
Patricia Arquette原创
2024-12-13 13:45:11427浏览

How Can I Resolve Go's

无法推断 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn