亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言加快工作效率的使用技巧有哪些

發布時間:2022-01-17 18:04:41 來源:億速云 閱讀:144 作者:iii 欄目:云計算

今天小編給大家分享一下Go語言加快工作效率的使用技巧有哪些的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

引入package的多種方式

有幾種非常規方式來引入包(package)。接下來我會使用fmt來作為例子:

import format "fmt" - 為fmt創造一個別名。把代碼中所有使用到fmt的內容用format.代替fmt.

import . "fmt" - 允許包內的內容不加fmt前綴而被被直接引用

import _ "fmt" - 阻止編譯器為引入fmt卻不使用里面的內容做引發的警告,執行package中的初始化函數。提醒一句,在這種情況下fmt是不可調用的

Goimports

命令goimports可以更新您的Go導入行,添加缺少的行,并刪除未引用的引導行。

它擁有和gofmt(插入式替換)相同的能力,但是goimports額外增加了修復imports的功能。

組織

Go是一種相對來說易學習的編程語言,但對于開發者來說,起初接觸這門語言最困難的事情就是如何組織代碼。scaffolding是人們喜歡Rails的原因之一,它可以給新晉的開發者清晰的方向,讓他們明白在哪里插入代碼,應該遵循怎樣的編程風格。

作為擴展,Go使用go fmt這樣的工具來提供開發者相同的功能。同樣地,Go的編譯器非常嚴格,它不會去編譯沒有使用的變量,或者沒有使用的import聲明。

自定義構造函數

我經常聽到別人問,“我什么時候應該使用像NewJob這樣的自定義構造函數?”,我的回答是“大多數情形下你沒必要這么做”。然而,當你需要在初始化的時候就設置值,且你有一些默認值的時候,這就最好使用一個構造函數。在這個例子中,構造函數就比較有意義了,因此我們用如下的代碼可以構建一個默認的logger:

package main
import (
    "log"
    "os"
)
type Job struct {
    Command string
    *log.Logger
}
func NewJob(command string) *Job {
    return &Job{command, log.New(os.Stderr, "Job: ", log.Ldate)}
}
func main() {
    NewJob("demo").Print("starting now...")
}

把代碼分解到不同的package中

以工程Gobot為例,它可以被分割為一個核心package和一些其他package。gobot的開發者們準備每個部分放在自己的package里。經過討論,他們選擇把所有的官方庫放在同一個repository下,讓import路徑變得干凈而富有邏輯。

所以,他們不打算把路徑設置為:

github.com/hybridgroup/gobot
github.com/hybridgroup/gobot-sphero
github.com/hybridgroup/gobot-...

而是設置為

github.com/hybridgroup/gobot
github.com/hybridgroup/gobot/sphero
github.com/hybridgroup/gobot/...

現在package的名字不再是冗長的gobot-sphero,而變成了簡要的sphero。

集合(Sets)

在其他的程序語言中,經常會有一種數據結構叫做sets,它允許把元素存入,但是不允許重復。Go并不直接支持這種結構,但是這個結構在Go里面的實現并不困難。

// UniqStr returns a copy if the passed slice with only unique string results.
func UniqStr(col []string) []string {
    m := map[string]struct{}{}
    for _, v := range col {
        if _, ok := m[v]; !ok {
            m[v] = struct{}{}
        }
    }
    list := make([]string, len(m))
    i := 0
    for v := range m {
        list[i] = v
        i++
    }
    return list
}

Playground鏈接

在這里,我會使用一些非常有意思的花招。首先,對空結構的映射:

m := map[string]struct{}{}

我們創建了一個map,這可以確保key是獨一無二的,而相關聯的value其實是我們不關心的。 我們當然可以使用:

m := map[string]bool{}

但是,使用空結構體可以達到同樣的效率,同時不會占用額外的內存。

第二個花招的意味更為深遠:

if _, ok := m[v]; !ok {
  m[v] = struct{}{}
}

這里做的事情就是確認map m中的某個值是否存在,而不關心value本身。如果發現沒有對應的值,就去加一個。當然,不去驗證直接加好像也沒有什么區別。

一旦我們擁有了一個充滿獨一無二key的map以后,就可以把他們放到一個切片里,返回結果了。

這里有一段測試代碼,正如你所見,這里使用了一個符合Go語言單元測試風格的表格測試:

func TestUniqStr(t *testing.T) {
    data := []struct{ in, out []string }{
        {[]string{}, []string{}},
        {[]string{"", "", ""}, []string{""}},
        {[]string{"a", "a"}, []string{"a"}},
        {[]string{"a", "b", "a"}, []string{"a", "b"}},
        {[]string{"a", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "b", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "a", "b", "b", "a", "b"}, []string{"a", "b"}},
        {[]string{"a", "b", "c", "a", "b", "c"}, []string{"a", "b", "c"}},
    }
    for _, exp := range data {
        res := UniqStr(exp.in)
        if !reflect.DeepEqual(res, exp.out) {
            t.Fatalf("%q didn't match %q\n", res, exp.out)
        }
    }
}

經過測試發現,并非每次都能夠成功,而是有概率的。因為map是使用hashmap實現的,使用range進行遍歷的時候,其遍歷順序和字符串的內容沒有必然聯系,因此此test有可能失敗。在進行DeapEqual比對的時候,可能會爆出類似于["b" "c" "a"] didn't match ["a" "b" "c"]的錯誤。當然,在Playground中,每次執行的上下文環境一模一樣,因此這里的test是總能通過的。

依賴包管理

很遺憾,Go語言官方并不提供依賴包管理系統。這很可能是因為go語言植根于C語言的文化,因此它沒有辦法引入特定版本的包。

這會帶來一些嚴重的問題:

  1. 當多個開發者共同維護一個項目時,不同開發者的依賴版本可能不同。

   2.依賴也會有他們自身的依賴,所以很難確保所有的依賴都使用同一個版本。 3.你的多個項目基于了同一個依賴的不同版本。

對于最后一種情形,可以通過搭建一個_持續集成環境(Continuousintegration)來解決,但是前兩者就相對困難。

以上就是“Go語言加快工作效率的使用技巧有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉孜县| 霍城县| 深水埗区| 澄迈县| 东明县| 石渠县| 鄂托克旗| 绥宁县| 方城县| 武陟县| 沁阳市| 奉贤区| 南开区| 新乡市| 积石山| 偏关县| 都兰县| 桂东县| 苏尼特右旗| 大同市| 项城市| 麻江县| 佛学| 当涂县| 宣汉县| 新绛县| 奉化市| 怀化市| 屯昌县| 开远市| 凯里市| 涟源市| 襄樊市| 郎溪县| 定兴县| 咸阳市| 潢川县| 报价| 钟山县| 宜春市| 运城市|