<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          『每周譯Go』快速指南:go1.18 特性

          共 334字,需瀏覽 1分鐘

           ·

          2021-12-18 13:37

          即將在 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 的更多資訊,還可以通過掃描的方式,進群一起探討哦~


          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲V国产v欧美v久久久久久 | 免费欧美一级 | 日韩无码视频电影 | 欧洲极品另类 | 人妻一区二区三区 |