IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 『每周译Go』快速指南:go1.18 特性 -> 正文阅读

[C++知识库]『每周译Go』快速指南:go1.18 特性

即将在 2022 年第一季发布的 Go 1.18 版本,有很多新特性正等着我们。

这个版本将是 Go 历史版本里最关键的版本之一,我们将在一个月内尝鲜到 beta 版。到底有哪些更新呢?

参数类型(泛型)

Go 期待已久的参数类型特性,也就是其他语言里的泛型。有了这个特性,我们可以给函数传递动态类型。让我们深入到一个简单的例子,通过编写一个函数来查找任意两个 int 变量中的最小值

func?minInt(x?int,?y?int)?int?{
???if?x?<?y?{
??????return?x
???}?else?{
??????return?y
???}
}

当我们需要为 float32 变量提供相同功能时,我们需要重新写一个类似的函数

func?minFloat(x?float32,?y?float32)?float32?{
???if?x?<?y?{
??????return?x
???}?else?{
??????return?y
???}
}

通过泛型的能力,我们可以轻松的定义一个函数,这样我们可以得到所需类型的变量。通过定义类型,我们还可以看到一个名为~的新操作符。这个操作符实际上返回给我们的是类型信息的接口,因此我们可以进行类型限制,让我们来编写相同的 min 函数来包含 int 和 float32,如下所示:

type?OrderTypes?interface?{?
???~int?|?~float32?
}
func?min[P?OrderTypes](x,?y?P)?P?{
????if?x?<?y?{
??????return?x
????}?else?{
??????return?y
????}
}

这看起来很可靠 ,对吧。Go 还建议使用已经定义类型组的约束库。例如,我们可以为所有有序类型实现我们的函数。

func?min[P?constraints.Ordered](x,?y?P)?P?{
????if?x?<?y?{
??????return?x
????}?else?{
??????return?y
????}
}

当然,泛型的使用不仅仅限于这个例子。它会非常有用,尤其 ORM-style 类型的问题中,在那种我们创建需要处理多个类型参数的函数。同时,你还可以跟着过一下 GO 团队分享的例子,从中得到一些想法。

除此之外,我们可以进行实验的在线编辑(playground)也很有用。如果你希望使用 1.18 在你自己的环境,你可以下载 gotip 并使用 Go 的活跃的分支。

#模糊测试 随着 Go1.18 软件包的发布,"模糊化"功能将进入我们的生活。有了这个在 beta 版提供的测试库,我们将能够在单元测试中自动做随机突变输入。

作为软件开发者,我们有时会忘了单元测试的边缘案例。特别在重要的库上,这种缺少数据的多样性可能会被滥用,也会导致安全泄漏和漏洞。我们可以通过模糊测试来预防这种情况。

为了实现模糊测试,你可以使用以模糊前缀开头的方法包装单元测试。你还可以使用 Go 的测试页作为示例代码。

func?FuzzHex(f?*testing.F)?{
??for?_,?seed?:=?range?[][]byte{{},?{0},?{9},?{0xa},?{0xf},?{1,?2,?3,?4}}?{
????f.Add(seed)
??}
??f.Fuzz(func(t?*testing.T,?in?[]byte)?{
????enc?:=?hex.EncodeToString(in)
????out,?err?:=?hex.DecodeString(enc)
????if?err?!=?nil?{
??????t.Fatalf("%v:?decode:?%v",?in,?err)
????}
????if?!bytes.Equal(in,?out)?{
??????t.Fatalf("%v:?not?equal?after?round?trip:?%v",?in,?out)
????}
??})
}

#工作区 此功能提升了同时需要处理多个模块的开发人员的便利性。尽管可以在 go.mod 1.17 版本中使用 replace 命令更改 module 版本。但是在提交代码的时候,常常忘记清除这些 replace 命令。对于我们开发人员来说,每次插入或删除该行都是一件非常麻烦的事情。

使用工作区功能,你可以创建一个名为 go.work 的新文件,在那里编写 replace 命令。此文件允许我们更改特定工作环境的 modules 且无需更改已有的 go.mod 文件。例如,你可以查看 property 提出的设计页面

go?1.17

directory?(
????./baz?//?foo.org/bar/baz
????./tools?//?golang.org/x/tools
)

replace?golang.org/x/net?=>?example.com/fork/net?v1.4.5

综上,Go1.18 提供了有用的模糊化和工作区特性,以及讨论、研究超过一年的泛型特性。除此之外,此版本还提供许多改进和修复,您可以通过此链接(https://github.com/golang/go/milestone/201) 了解版本的状态及其包含的内容。

- 原文地址:https://medium.com/@emreodabas_20110/quick-guide-go-1-18-features-e236d5b351ef

- 原文作者:Emre Odabas

- 本文永久链接:https://github.com/gocn/translator/blob/master/2021/w48_quick_guide_go1.18_features.md

- 译者:cuua

- 校对:zxmfke

想要了解关于 Go 的更多资讯,还可以通过扫描的方式,进群一起探讨哦~

c94725771ddab0fbf2bfebe2e2a24bcc.png

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-21 17:35:09  更:2021-12-21 17:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:34:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码