- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Go1.18 泛型的好、坏亦或丑?由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
大家好,我是程序员幽鬼.
Go 泛型定了,有哪些好的使用场景,哪些不好的应用场景,亦或哪些使用看起来丑?本文聊聊这个问题.
泛型很棒,而且 Go 变得比以前更方便了。但是与可能非常有用的 channel 类似,我们不应该仅仅因为它们存在就到处使用它们.
除了用于数据结构,泛型还有其他很好的应用场景。当然,也有一些不好的用例,比如泛型日志器。还有一些可以使用的解决方案,但相当丑陋,还有一些东西真的很丑.
让我们分别看一个例子.
我真正梦想在 Go 中做的以及我认为我现在终于可以做的是 CRUD 端点的泛型提供程序:
这是一个大接口,你可以根据具体用例的需要缩短它,但是,为了完整性起见,我们暂时就这么写.
现在你可以定义一个使用 DataProvider 的 HTTP 处理程序:
如你所见,我们可以为每个方法实现一次,然后我们就完成了。我们甚至可以在事物的另一端创建一个客户端,我们只需要为基本方法实现一次.
为什么我们在这里使用泛型而不是简单的我们已经定义的 Model 接口?
与在此处使用 Model 类型本身相比,泛型有一些优点:
在这个验证器中是泛型方法的真正优势所在。我们将解析 HTTP 请求,如果定义了自定义的 InsertValidator,那么我们可以使用它来验证模型是否检出,我们可以以类型安全的方式进行并使用具体模型:
所以我们有一个泛型的处理器,我们可以用自定义回调来调整它,它直接为我们获取有效负载。没有类型转换。没有 map。只有结构体本身.
一起看一个泛型日志器的例子:
这本身还不是很有用。有更简单的方法可以将键值字符串对添加到日志器,并且没有日志器(据我所知)实际实现此接口。我们也不需要新的日志标准。如果我们想使用 logrus[1],我们必须这样做:
如果我们添加自引用部分,这实际上可能由 logrus 日志器实现。但是,让我们考虑在实际结构体中使用它,例如某种处理程序:
为了在结构体中使用这个日志器,我们需要使我们的结构体泛型,这仅适用于日志器。如果 MessageHandler 本身正在处理泛型消息,那将变成第三个类型参数.
到目前为止,甚至没有办法将其分配给具有泛型的变量。所以,尽管我们可以用一个接口来表示这个日志器很棒,但我实际上建议不要这样做。而我最喜欢的日志库 (zap[2]),由于其字段的性质,甚至无法用它来表示.
当我使用泛型时,我发现缺少对在方法中引入新泛型参数的支持。虽然这可能有很好的理由,但它确实需要一些解决方法。让我们想象一下我们想要将一个 map 简化为一个整数。理想情况下,我们将通过使用返回新泛型参数的方法来完成此操作,然后我们可以简单地提供 map reduce 函数.
那么,当我们仍然想以泛型方式缩小该 map 时,我们该怎么办?既然没有方法,那么让我们创建一个方法:
GenericMap 成为第一个参数或我们的 Reduce 函数。在这种情况下,你可以使用任何类型的 map 作为第一个参数,而不是 GenericMap。然而,我想说明的一点是,如果这个方法本身是 GenericMap 的一部分,那就太好了。即使不是,我们仍然可以模仿这种行为。总的来说,我可能仍会在某些用例中使用这种模式,即使它实际上很丑陋.
有时你可能想要使用工厂模式,它为你提供诸如 DataProviders 之类的东西。你可能希望在动态注册的端点上获取提供程序。所以你可以这样做:
虽然这有效,虽然它可能有用,但它是很丑。它将丑陋(反射)与更丑陋(泛型)的东西结合在一起.
虽然从技术上讲这应该是类型安全的,但由于我们的复合键具有名称和反射类型,它仍然很难看。我是否要把它放在生产代码的任何地方,我会很纠结.
虽然我喜欢泛型,但我认为很难取得平衡,尤其是在开始的时候。所以我们需要确保记住它们为什么存在,在什么情况下我们应该使用它们,什么时候我们应该避免它们.
原文链接: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 。
本文转载自微信公众号「幽鬼」,可以通过以下二维码关注。转载本文请联系幽鬼公众号.
原文链接:https://mp.weixin.qq.com/s/Xp7B3okOOcNedhNMM1pU3Q 。
最后此篇关于Go1.18 泛型的好、坏亦或丑?的文章就讲到这里了,如果你想了解更多关于Go1.18 泛型的好、坏亦或丑?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我制作了一个简单的 Chrome 扩展程序,可以自动将我带到我正在观看的系列节目的下一集。只是要清楚:代码有效! :p 但是,由于对 Chrome API 的调用大部分是异步的,我不得不将函数分成 3
在发布此问题之前,我尝试了在 Android 部分找到的所有答案,但均未成功... 由于某种原因,设备中的图像质量很差,而 Eclipse 和虚拟设备中的图像质量非常好 查看屏幕截图示例: examp
我想在一个小型机器集群(尽可能小)上支持大约 10,000 个并发 HTTP 客户端。我想在用户使用应用程序时与每个客户端保持连接,以允许服务器推送更新。 我相信异步 IO 通常被推荐用于这些类型的长
基本上,当我在 Eclipse 上自动完成(按 CTRL+Space)时,程序会滞后大约 5 秒。这真的很烦人,因为我经常使用自动完成功能。我该如何解决这个问题? 我正在处理的工作区位于具有 1Gbi
在我的模式中,我已经规范化了我的数据库并且到处都有 FK,因为社交网络中有如此多的链接关系,尤其是将用户链接到所有内容。 现在很明显,在社交网络中,性能会成败。这意味着“读取”时间比“写入”时间更重要
我有一个名为 globals.swift 的文件 代码很简单,看起来像这样。 import Foundation import CoreData import UIKit var g_workOrde
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
偶然发现了一个计算数字平方根的(糟糕的)算法。陷入了关于时间复杂度的小争论。我断言时间复杂度是 O(n^2) 因为对于 n 个输入,它将被乘以 n 次。我的 friend 断言时间复杂度实际上是 O(
这是一个一般性的问题,但为了解释它,我将使用一个具体的例子。 我有一个加载文档的函数。如果该文档不存在,它将创建它,如果它存在,它将把它转换为一个 JSON 数组。我总是希望此函数返回某种数组,无论
我要找 坏 使用继承的例子。我不是很有创意,所以这是我能想到的最好的: class Car : public Engine {} 汽车有发动机,但它不是发动机。 这可能有助于解释这个概念,但我相信还有
我很好奇......在内存缓存中使用压缩有什么优点/缺点吗? 最佳答案 许多客户端进行压缩,但服务器本身没有进行压缩。 客户端压缩意味着通过网络发送的数据更少,但更重要的是,单个对象更小。较小的物体可
我正在尝试将 OpenGL 渲染封装在渲染器类中。 我很确定我的窗口类工作正常(我检查了错误),但我认为错误在我的 Sprite 类中,但我不知道它是什么。 这是我的 Sprite 类: sprite
max(M,N,M):-M >= N,!. max(M,N,N). 我正在读一本教科书,说陈述性和程序性含义不同...我不知道该怎么做。 有人可以指出我正确的方向吗? 最佳答案 tl; dr:这不是关
我在线性回归模型上使用留一交叉验证。拥有 8869 个观察结果,原因如下: reg = LinearRegression() list_Rs = cross_val_score(reg, X_34_c
我在想....我有一个网站,其中正在进行大量搜索/排序。如果我将每次搜索的结果项 ID 缓存到 MEMORY 表中,然后简单地执行 WHERE item_id IN ("1", "5", "44",
我有一个 adopted为 Silverlight 实现一个简单的(无升级或超时)ReaderWriterLock,我想知道任何具有适当专业知识的人都可以验证它的设计是好是坏。对我来说它看起来很不错,
这是我在单击按钮时删除所选项目的代码,我在此代码中添加了警报对话框,添加此警报框后,发生 fatal error 异常。 public class MycustomAdapter extends B
我正在从 MySQL 数据库中获取数据。结果在对象中返回。 然后我可以像这样访问数据: $db_data->row 在 foreach 循环中,我通过添加一个数组来更改 $db_data,例如: fo
在我完成的几个 .NET C# web 服务项目中,我已经在单例模式的帮助下访问了静态数据库。然后前几天我的 friend 告诉我这是一件坏事,因为如果对同一个数据库实体发出大量请求,那么数据库将因为
在类的构造函数中进行数据库查询以便在创建类的新实例时加载它是否是一种不好的做法? class Home { private $home_id = null; private $home
我是一名优秀的程序员,十分优秀!