<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 結(jié)構(gòu)體的另類玩法:命名空間

          共 1965字,需瀏覽 4分鐘

           ·

          2021-06-24 01:03

          點擊上方藍(lán)色“Go語言中文網(wǎng)”關(guān)注,每天一起學(xué) Go

          假設(shè),但不是憑空想象,在你的程序中,你注冊了一堆 expvar 包的統(tǒng)計變量[1],用來在暴露出去的 JSON 結(jié)果中能有一個容易辨識的名字。普通的實現(xiàn)方式下,你可能會有一大堆全局變量,對應(yīng)著程序追蹤的各種信息。這些變量與其他的全局變量混成一團(tuán),這毫無美感,如果我們能規(guī)避這種情況,那么事情會變得不那么糟糕。

          歸功于 Go 對匿名結(jié)構(gòu)類型的支持,我們可以實現(xiàn)。我們可以基于匿名結(jié)構(gòu)類型創(chuàng)建一個變量集合的命名空間:

          var events struct {
              connections, messages [expvar.Int](expvar.Int "expvar.Int")

              tlsconns, tlserrors [expvar.Int](expvar.Int "expvar.Int")
          }

          在我們的代碼中,我們可以使用 events.connects 等等,而不是必須用一些很糟糕或容易引起歧義的名字。

          我們也可以在全局等級范圍外用這種方法。你可以在這種命名空間結(jié)構(gòu)內(nèi)把任意的變量名集合隔離開。一個例子就是把計數(shù)變量嵌入到另一個結(jié)構(gòu)體中:

          type ipMap struct {
              sync.Mutex
              ips map[string]int
              stat struct {
                  Size, Adds, Lookups, Dels int
              }
          }

          原因很明顯,這對于不需要進(jìn)行初始化的變量類型是最好的解決方案;其他的變量類型需要進(jìn)行一些初始化,這稍微有一點點笨重。

          這可能不合某些人的口味,我也不知道這在 Go 中是不是好的做法。我的個人觀點是,我與其用前綴 prefix_ 來隔離變量名,不如用前綴 prefix. ,盡管人為地引入了這樣的匿名結(jié)構(gòu)體。但是一些人可能會有不同看法。即使在我看來,它也確實是侵入較大的修改,但可能它是合法的。

          (為了更加明確地統(tǒng)計計數(shù)信息,這也是一種方便地暴露所有信息的方法[2])

          出于好奇我快速瀏覽了當(dāng)前開發(fā)中的 Go 編譯器和標(biāo)準(zhǔn)庫,隱約在幾處地方發(fā)現(xiàn)了疑似使用這種方式的地方。并不是所有的使用方式都一樣,所以看了源碼后我要說的重點是,這似乎也不是一種完全不可容忍或被原作者反對的觀點。


          via: https://utcc.utoronto.ca/~cks/space/blog/programming/GoStructsForNamespaces

          作者:Chris Siebenmann[3]譯者:lxbwolf[4]校對:polaris1119[5]

          本文由 GCTT[6] 原創(chuàng)編譯,Go 中文網(wǎng)[7] 榮譽(yù)推出

          參考資料

          [1]

          expvar 包的統(tǒng)計變量: https://golang.org/pkg/expvar/

          [2]

          這也是一種方便地暴露所有信息的方法: https://utcc.utoronto.ca/~cks/space/blog/programming/GoExpvarNotes

          [3]

          Chris Siebenmann: https://utcc.utoronto.ca/~cks/

          [4]

          lxbwolf: https://github.com/lxbwolf

          [5]

          polaris1119: https://github.com/polaris1119

          [6]

          GCTT: https://github.com/studygolang/GCTT

          [7]

          Go 中文網(wǎng): https://studygolang.com/



          推薦閱讀


          福利

          我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

          瀏覽 62
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  在线xx视频 | 国产人妻精品久久久久野外 | 日韩欧美AAA | 欧美丁香五月天 | 大香蕉国产视频播放 |