截至2021年11月17日,社区可能还没有使用 Go 1.18 泛型功能的缓存库。
我尝试在这里实现了第一个 Go 1.18 泛型的缓存库。如果你能够给的 GitHub 加个 Star,我会感到非常高兴。/Code-Hex/go-generics-cache
在这篇文章中,我将介绍我在开发这个缓存库时遇到的关于 Go 泛型的一些情况,以及我发现的一些技巧和困扰。
对任何类型都返回零值
你经常会写一些返回 any
和 error
的代码,比如说下面这样。当一个函数发生错误时,你会写一些返回零值和错误的代码,但现在你需要换一种思维方式。
func Do[V any](v V) (V, error) {
if err := validate(v); err != nil {
// What should we return here?
}
return v, nil
}
func validate[V any](v V) error
假设你在这里写return 0
, err
。这将是一个编译错误。原因是any
类型可以是int
类型以外的类型,比如string
类型。那么我们应该怎么做呢?
让我们用类型参数的V
声明一次变量。然后你可以把它写成可编译的形式,如下:
func Do[V any](v V) (V, error) {