『每周譯Go』快速指南:go1.18 特性
即將在 2022 年第一季發(fā)布的 Go 1.18 版本,有很多新特性正等著我們。
這個版本將是 Go 歷史版本里最關(guān)鍵的版本之一,我們將在一個月內(nèi)嘗鮮到 beta 版。到底有哪些更新呢?
參數(shù)類型(泛型)
Go 期待已久的參數(shù)類型特性,也就是其他語言里的泛型。有了這個特性,我們可以給函數(shù)傳遞動態(tài)類型。讓我們深入到一個簡單的例子,通過編寫一個函數(shù)來查找任意兩個 int 變量中的最小值
func?minInt(x?int,?y?int)?int?{
???if?x???????return?x
???}?else?{
??????return?y
???}
}
當(dāng)我們需要為 float32 變量提供相同功能時,我們需要重新寫一個類似的函數(shù)
func?minFloat(x?float32,?y?float32)?float32?{
???if?x???????return?x
???}?else?{
??????return?y
???}
}
通過泛型的能力,我們可以輕松的定義一個函數(shù),這樣我們可以得到所需類型的變量。通過定義類型,我們還可以看到一個名為~的新操作符。這個操作符實際上返回給我們的是類型信息的接口,因此我們可以進行類型限制,讓我們來編寫相同的 min 函數(shù)來包含 int 和 float32,如下所示:
type?OrderTypes?interface?{?
???~int?|?~float32?
}
func?min[P?OrderTypes](x,?y?P)?P?{
????if?x???????return?x
????}?else?{
??????return?y
????}
}
這看起來很可靠 ,對吧。Go 還建議使用已經(jīng)定義類型組的約束庫。例如,我們可以為所有有序類型實現(xiàn)我們的函數(shù)。
func?min[P?constraints.Ordered](x,?y?P)?P?{
????if?x???????return?x
????}?else?{
??????return?y
????}
}
當(dāng)然,泛型的使用不僅僅限于這個例子。它會非常有用,尤其 ORM-style 類型的問題中,在那種我們創(chuàng)建需要處理多個類型參數(shù)的函數(shù)。同時,你還可以跟著過一下 GO 團隊分享的例子,從中得到一些想法。
除此之外,我們可以進行實驗的在線編輯(playground)也很有用。如果你希望使用 1.18 在你自己的環(huán)境,你可以下載 gotip 并使用 Go 的活躍的分支。
#模糊測試 隨著 Go1.18 軟件包的發(fā)布,"模糊化"功能將進入我們的生活。有了這個在 beta 版提供的測試庫,我們將能夠在單元測試中自動做隨機突變輸入。
作為軟件開發(fā)者,我們有時會忘了單元測試的邊緣案例。特別在重要的庫上,這種缺少數(shù)據(jù)的多樣性可能會被濫用,也會導(dǎo)致安全泄漏和漏洞。我們可以通過模糊測試來預(yù)防這種情況。
為了實現(xiàn)模糊測試,你可以使用以模糊前綴開頭的方法包裝單元測試。你還可以使用 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)
????}
??})
}
#工作區(qū) 此功能提升了同時需要處理多個模塊的開發(fā)人員的便利性。盡管可以在 go.mod 1.17 版本中使用 replace 命令更改 module 版本。但是在提交代碼的時候,常常忘記清除這些 replace 命令。對于我們開發(fā)人員來說,每次插入或刪除該行都是一件非常麻煩的事情。
使用工作區(qū)功能,你可以創(chuàng)建一個名為 go.work 的新文件,在那里編寫 replace 命令。此文件允許我們更改特定工作環(huán)境的 modules 且無需更改已有的 go.mod 文件。例如,你可以查看 property 提出的設(shè)計頁面
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 提供了有用的模糊化和工作區(qū)特性,以及討論、研究超過一年的泛型特性。除此之外,此版本還提供許多改進和修復(fù),您可以通過此鏈接(https://github.com/golang/go/milestone/201) 了解版本的狀態(tài)及其包含的內(nèi)容。
- 原文地址: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
想要了解關(guān)于 Go 的更多資訊,還可以通過掃描的方式,進群一起探討哦~
