成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

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

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

創(chuàng)新互聯(lián)為客戶提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁設(shè)計(jì)、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、成都做手機(jī)網(wǎng)站等網(wǎng)站方面業(yè)務(wù)。

引入package的多種方式

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

import format "fmt" - 為fmt創(chuàng)造一個(gè)別名。把代碼中所有使用到fmt的內(nèi)容用format.代替fmt.

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

import _ "fmt" - 阻止編譯器為引入fmt卻不使用里面的內(nèi)容做引發(fā)的警告,執(zhí)行package中的初始化函數(shù)。提醒一句,在這種情況下fmt是不可調(diào)用的

Goimports

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

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

組織

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

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

自定義構(gòu)造函數(shù)

我經(jīng)常聽到別人問,“我什么時(shí)候應(yīng)該使用像NewJob這樣的自定義構(gòu)造函數(shù)?”,我的回答是“大多數(shù)情形下你沒必要這么做”。然而,當(dāng)你需要在初始化的時(shí)候就設(shè)置值,且你有一些默認(rèn)值的時(shí)候,這就最好使用一個(gè)構(gòu)造函數(shù)。在這個(gè)例子中,構(gòu)造函數(shù)就比較有意義了,因此我們用如下的代碼可以構(gòu)建一個(gè)默認(rèn)的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為例,它可以被分割為一個(gè)核心package和一些其他package。gobot的開發(fā)者們準(zhǔn)備每個(gè)部分放在自己的package里。經(jīng)過討論,他們選擇把所有的官方庫放在同一個(gè)repository下,讓import路徑變得干凈而富有邏輯。

所以,他們不打算把路徑設(shè)置為:

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

而是設(shè)置為

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

現(xiàn)在package的名字不再是冗長(zhǎng)的gobot-sphero,而變成了簡(jiǎn)要的sphero。

集合(Sets)

在其他的程序語言中,經(jīng)常會(huì)有一種數(shù)據(jù)結(jié)構(gòu)叫做sets,它允許把元素存入,但是不允許重復(fù)。Go并不直接支持這種結(jié)構(gòu),但是這個(gè)結(jié)構(gòu)在Go里面的實(shí)現(xiàn)并不困難。

// 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鏈接

在這里,我會(huì)使用一些非常有意思的花招。首先,對(duì)空結(jié)構(gòu)的映射:

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

我們創(chuàng)建了一個(gè)map,這可以確保key是獨(dú)一無二的,而相關(guān)聯(lián)的value其實(shí)是我們不關(guān)心的。 我們當(dāng)然可以使用:

m := map[string]bool{}

但是,使用空結(jié)構(gòu)體可以達(dá)到同樣的效率,同時(shí)不會(huì)占用額外的內(nèi)存。

第二個(gè)花招的意味更為深遠(yuǎn):

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

這里做的事情就是確認(rèn)map m中的某個(gè)值是否存在,而不關(guān)心value本身。如果發(fā)現(xiàn)沒有對(duì)應(yīng)的值,就去加一個(gè)。當(dāng)然,不去驗(yàn)證直接加好像也沒有什么區(qū)別。

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

這里有一段測(cè)試代碼,正如你所見,這里使用了一個(gè)符合Go語言單元測(cè)試風(fēng)格的表格測(cè)試:

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)
        }
    }
}

經(jīng)過測(cè)試發(fā)現(xiàn),并非每次都能夠成功,而是有概率的。因?yàn)閙ap是使用hashmap實(shí)現(xiàn)的,使用range進(jìn)行遍歷的時(shí)候,其遍歷順序和字符串的內(nèi)容沒有必然聯(lián)系,因此此test有可能失敗。在進(jìn)行DeapEqual比對(duì)的時(shí)候,可能會(huì)爆出類似于["b" "c" "a"] didn't match ["a" "b" "c"]的錯(cuò)誤。當(dāng)然,在Playground中,每次執(zhí)行的上下文環(huán)境一模一樣,因此這里的test是總能通過的。

依賴包管理

很遺憾,Go語言官方并不提供依賴包管理系統(tǒng)。這很可能是因?yàn)間o語言植根于C語言的文化,因此它沒有辦法引入特定版本的包。

這會(huì)帶來一些嚴(yán)重的問題:

  1. 當(dāng)多個(gè)開發(fā)者共同維護(hù)一個(gè)項(xiàng)目時(shí),不同開發(fā)者的依賴版本可能不同。

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

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

以上就是“Go語言加快工作效率的使用技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:Go語言加快工作效率的使用技巧有哪些
本文URL:http://jinyejixie.com/article0/ppejio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務(wù)器、App開發(fā)網(wǎng)站改版、響應(yīng)式網(wǎng)站、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
聊城市| 渭源县| 巴林右旗| 重庆市| 称多县| 宁乡县| 米林县| 镇远县| 新丰县| 仙游县| 昌吉市| 怀柔区| 青河县| 泌阳县| 万全县| 防城港市| 横峰县| 西吉县| 浙江省| 泽普县| 即墨市| 舞阳县| 陕西省| 平罗县| 二手房| 昌黎县| 安义县| 南平市| 葫芦岛市| 阳春市| 内黄县| 丰原市| 比如县| 和田县| 深圳市| 天等县| 焦作市| 黔南| 湄潭县| 绥宁县| 四子王旗|