Go1.18 泛型的好、坏亦或丑?( 二 )

GenericMap 成为第一个参数或我们的 Reduce 函数 。在这种情况下,你可以使用任何类型的 map 作为第一个参数,而不是 GenericMap 。然而,我想说明的一点是,如果这个方法本身是 GenericMap 的一部分,那就太好了 。即使不是,我们仍然可以模仿这种行为 。总的来说,我可能仍会在某些用例中使用这种模式,即使它实际上很丑陋 。
05 真的很丑有时你可能想要使用工厂模式,它为你提供诸如 DataProviders 之类的东西 。你可能希望在动态注册的端点上获取提供程序 。所以你可以这样做:
type DataProviderFactory struct {dataProviders map[providerKey]any}func ProviderByName[MODEL Model](factory *DataProviderFactory, name string "MODEL Model") (DataProvider[MODEL], bool) {var m MODELprov, has := factory.dataProviders[providerKey{name: name, typ: reflect.TypeOf(m)}]if !has {return nil, false}return prov.(DataProvider[MODEL]), true }func RegisterProvider[MODEL Model](factory *DataProviderFactory, name string, p DataProvider[MODEL] "MODEL Model") {var m MODELfactory.dataProviders[providerKey{name: name, typ: reflect.TypeOf(m)}] = p }虽然这有效,虽然它可能有用,但它是很丑 。它将丑陋(反射)与更丑陋(泛型)的东西结合在一起 。
虽然从技术上讲这应该是类型安全的,但由于我们的复合键具有名称和反射类型,它仍然很难看 。我是否要把它放在生产代码的任何地方,我会很纠结 。
06 总结虽然我喜欢泛型,但我认为很难取得平衡,尤其是在开始的时候 。所以我们需要确保记住它们为什么存在,在什么情况下我们应该使用它们,什么时候我们应该避免它们!

【Go1.18 泛型的好、坏亦或丑?】原文链接:https://itnext.io/golang-1-18-generics-the-good-the-bad-the-ugly-5e9fa2520e76
参考资料[1]
logrus: https://github.com/sirupsen/logrus
[2]
zap: https://github.com/uber-go/zap




推荐阅读