当前位置: 首页 > 科技观察

Go1.18的三个特性,你知道几个

时间:2023-03-12 04:45:22 科技观察

大家好,我是幽灵程序员。每个人都兴奋的是,在开发人员要求泛型的十年左右[1]之后,Go编程语言将在2022年第一季度的Go1.18中获得泛型类型和函数[2]。毫无疑问,泛型将导致很多实验,一些好的[3],一些不好的[4],还有一些奇怪的[5]。Go1.18还准备通过将模糊测试[6]测试作为标准测试包的一部分来提高软件可靠性。但今天,我想看看Go1.18中的一些细微变化,否则这些变化可能会在泛型这一主要特性的兴奋中迷失。1.二进制文件中包含的版本控制信息在使用go:generate[7]和go:embed[8]时,其中一个激励性的例子是能够对用于创建二进制文件的Git提交信息进行哈希处理,信息嵌入其中。在Go1.18中,这成为日常Go命令的自动组成部分。通过返回runtime/debug.ReadBuildInfo()[10]更新runtime/debug.BuildInfo[9]以包含新字段Settings[]debug.BuildSetting。Settings[11]又是描述二进制文件的键值对。提交哈希是键vcs.revision的值,而vcs.time执行预期的操作。甚至vcs.modified也可以告诉您构建是“脏”还是“干净”。因为从slice读取debug.BuildSetting有点复杂,我写了一个叫versioninfo[12]的小包,在启动时读取debug信息,设置versioninfo.Revision,versioninfo.LastCommit和versioninfo.DirtyBuild,不过你可以自己写助手库[13]。2.新的http.MaxBytesHandler中间件http.MaxBytesHandler[14]没什么好说的。好像除了吹嘘函数是我写的[15]。其实不是我设计的。它只是在Go问题跟踪器中请求和批准的五行函数,我认为在其他任务之间编写和提交已经足够简单了。这是文档:MaxBytesHandler返回一个运行h的处理程序,其ResponseWriter和Request.Body由MaxBytesReader包装。这种情况是,如果您将服务器直接暴露在Internet上,您可能希望限制您正在处理的请求的大小以避免拒绝服务攻击。这已经可以在带有http.MaxBytesReader[16]的处理程序中完成,但是通过在中间件级别强制执行限制,现在您可以确保它不会意外地留在Web服务器的某个未被注意的角落。3.不合理但有效的strings.Cut函数strings.Cut[17]类似于Python的str.partition[18],它在第一个找到分隔符子串的位置将字符串切成两段。为什么不添加LastCut?RussCox的解释是LastIndex的调用次数明显少于Index,所以暂时不提供LastCut。有关详细信息,请参阅RussCox在该问题中所写的内容:https://github.com/golang/go/issues/46336。本文作者:CarlM.Johnson原文链接:https://blog.carlmjohnson.net/post/2021/golang-118-minor-features/参考文献[1]十年左右:https://blog.carlmjohnson.net/post/google-go-the-good-the-bad-and-the-meh/[2]通用类型和函数:https://go.dev/blog/why-generics[3]优点:https://github.com/carlmjohnson/deque/[4]不好的:https://github.com/carlmjohnson/new/[5]奇怪的:https://github.com/carlmjohnson/truthy/[6]模糊测试:https://go.dev/blog/fuzz-beta[7]使用go:generate:https://blog.carlmjohnson.net/post/2016-11-27-how-to-use-go-generate/[8]go:embed:https://blog.carlmjohnson.net/post/2021/how-to-use-go-embed/[9]runtime/debug.BuildInfo:https://pkg.go。dev/runtime/debug@master#BuildInfo[10]runtime/debug.ReadBuildInfo():https://pkg.go.dev/runtime/debug@master#ReadBuildInfo[11]设置:https://pkg.go。dev/runtime/debug@master#BuildSetting[12]版本信息:https://github.com/carlmjohnson/versioninfo/[13]随意编写自己的帮助程序库:https://blog.carlmjohnson.net/post/2020/avoid-dependencies/[14]http.MaxBytesHandler:https://pkg.go.dev/net/http@master#MaxBytesHandler[15]我写道:https://golang.org/cl/346569[16]http.MaxBytesReader:https://pkg.go.dev/net/http#MaxBytesReader[17]strings.Cut:https://pkg.go.dev/strings@master#Cut[18]str.partition:https://docs.python.org/3/library/stdtypes。html#str.partition本文作者:CarlM.Johnson本文转载自微信公众号“有鬼”,您可以通过以下二维码关注转载文章,请联系有鬼公众号。