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
推荐阅读
- Springboot使用OkHttp实现微信支付API-V3签名、证书的管理和使用
- 几个超火的编程网站,别错过
- Win10如何连接手机摄像头?Win10连接手机摄像头的方法
- 冷门但巨好用!这些堪称“神器”的电脑数据线,你了解几个?
- 茶的种类工夫红茶,红茶的种类及特征
- 今天带大家认识光纤,也就是目前家庭宽带的入户线
- 武夷山红茶的种类,红茶的种类和图片大全
- 红茶的种类作用,喝红茶的人代表什么作用
- 红茶种类跟口感,树上的红茶
- 滇红红茶的种类,红茶的专业知识