久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

共計(jì) 3199 個(gè)字符,預(yù)計(jì)需要花費(fèi) 8 分鐘才能閱讀完成。

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

引入 package 的多種方式

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

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

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

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

我經(jīng)常聽(tīng)到別人問(wèn),“我什么時(shí)候應(yīng)該使用像 NewJob 這樣的自定義構(gòu)造函數(shù)?”,我的回答是“大多數(shù)情形下你沒(méi)必要這么做”。然而,當(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 的開(kāi)發(fā)者們準(zhǔn)備每個(gè)部分放在自己的 package 里。經(jīng)過(guò)討論,他們選擇把所有的官方庫(kù)放在同一個(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)

在其他的程序語(yǔ)言中,經(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ú)一無(wú)二的,而相關(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)沒(méi)有對(duì)應(yīng)的值,就去加一個(gè)。當(dāng)然,不去驗(yàn)證直接加好像也沒(méi)有什么區(qū)別。

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

這里有一段測(cè)試代碼,正如你所見(jiàn),這里使用了一個(gè)符合 Go 語(yǔ)言單元測(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)過(guò)測(cè)試發(fā)現(xiàn),并非每次都能夠成功,而是有概率的。因?yàn)?map 是使用 hashmap 實(shí)現(xiàn)的,使用 range 進(jìn)行遍歷的時(shí)候,其遍歷順序和字符串的內(nèi)容沒(mé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 是總能通過(guò)的。

依賴包管理

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

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

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

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

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

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

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-03發(fā)表,共計(jì)3199字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 四川省| 乐安县| 德江县| 荆州市| 涿鹿县| 饶河县| 清河县| 襄汾县| 泽库县| 颍上县| 哈尔滨市| 乐亭县| 五河县| 宁蒗| 屯昌县| 五台县| 南木林县| 泰兴市| 绥阳县| 黄大仙区| 望城县| 九寨沟县| 阿拉善右旗| 皮山县| 裕民县| 肇州县| 鄂托克旗| 香河县| 满城县| 潼关县| 吉隆县| 府谷县| 勐海县| 新营市| 芦山县| 蒲江县| 上饶县| 平武县| 塔城市| 阳江市| 密山市|