1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Go 結(jié)構(gòu)體的另類玩法:命名空間

        共 1965字,需瀏覽 4分鐘

         ·

        2021-06-24 01:03

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

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

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

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

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

        出于好奇我快速瀏覽了當前開發(fā)中的 Go 編譯器和標準庫,隱約在幾處地方發(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] 榮譽推出

        參考資料

        [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/



        推薦閱讀


        福利

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

        瀏覽 62
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            337p粉嫩大胆色噜噜噜噜在线播放 | 免费看成人AAAAA视频在线 | 91牛| 国产成人免费1000部网站 | 欧美一区自拍 | 精品国产美女AV天堂 | 中文字幕免费高清视频 | 特一级黄A片 | 淫色激情网| 人人摸人人搞 |