Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率
引言
近年來,Go語言迅速占領(lǐng)了開發(fā)領(lǐng)域的重要地位,成為眾多公司和開發(fā)者的首選語言。
其簡捷、高效、并發(fā)性強(qiáng)的特點(diǎn)使得它在處理大型系統(tǒng)和復(fù)雜工程問題時表現(xiàn)出色,為開發(fā)者提供了良好的體驗。
隨著云計算、容器化、微服務(wù)、服務(wù)網(wǎng)格等技術(shù)的興起,Go語言的應(yīng)用場景愈發(fā)廣泛,這也進(jìn)一步推動其社區(qū)的繁榮和發(fā)展。
可以預(yù)見,Go語言的發(fā)展前景將會更加廣闊。
本文分享幾個你可能不知道的Go語言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語言~~
01 數(shù)字字面量
Go語言中聲明數(shù)字變量時,可以使用數(shù)字字面量讓開發(fā)者以二進(jìn)制、八進(jìn)制或十六進(jìn)制浮點(diǎn)數(shù)的格式定義數(shù)字。例如:
v1 := 0b00101101 // 二進(jìn)制字面量
v2 := 0o377 // 八進(jìn)制字面量
v3 := 0x1p-2 // 十六進(jìn)制浮點(diǎn)字面量
v4 := 01e2 // 十進(jìn)制浮點(diǎn)字面量
在表達(dá)數(shù)字字面量時,可以使用_分隔數(shù)字。例如:
v5 := 123_456 // 可以使用_分隔數(shù)字
02 切片表達(dá)式
切片表達(dá)式指從字符串、數(shù)組、指向數(shù)組或切片的指針構(gòu)造子字符串或切片。
它有兩種變體,其中一種是指定low和high兩個索引界限值。
由于切片的底層是數(shù)組,所以我們可以基于數(shù)組通過切片表達(dá)式得到切片,切片表達(dá)式中的low和high表示索引范圍(左包含,右不包含)。
例如,下面的代碼表示從數(shù)組a中選出1≤索引值<4的元素組成切片s,切片s的長度為high-low,容量為其底層數(shù)組的容量。
// 對數(shù)組取切片 a := [5]int{1, 2, 3, 4, 5} s := a[1:3] // s := a[low:high] fmt.Printf("s:%v type:%T len:%v cap:%v\n", s, s, len(s), cap(s)) // 對字符串取切片得到的還是字符串類型 b := "hello world" s2 := b[1:3] // s2 := b[low:high] fmt.Printf("s2:%v type:%T len:%v\n", s2, s2, len(s2))
輸出:
s:[2 3] type:[]int len:2 cap:4
s2:el type:string len:2
方便起見,可以省略切片表達(dá)式中的任何索引。如果省略low則默認(rèn)為0,如果省略high則默認(rèn)為切片操作數(shù)的長度。
a[2:] // 等同于 a[2:len(a)]
a[:3] // 等同于 a[0:3]
a[:] // 等同于 a[0:len(a)]
注意:對于數(shù)組或字符串,如果0 ≤ low ≤ high ≤ len(a),則索引合法;否則會索引越界(out of range)。
對切片再執(zhí)行切片表達(dá)式時(切片再切片),high的上限是切片的容量cap(a),而不是長度。
常量索引必須是非負(fù)的,并且可以用int類型的值表示。
對于數(shù)組或常量字符串,常量索引必須在有效范圍內(nèi)。
如果low和high兩個指標(biāo)都是常數(shù),則它們必須滿足low≤high。
如果索引在運(yùn)行時超出范圍,就會發(fā)生運(yùn)行時panic。
a := [5]int{1, 2, 3, 4, 5} s := a[1:3] // s := a[low:high] fmt.Printf("s:%v len:%v cap:%v\n", s, len(s), cap(s)) s2 := s[3:4] // 索引的上限是cap(s)而不是len(s) fmt.Printf("s2:%v len:%v cap:%v\n", s2, len(s2), cap(s2))
輸出:
s:[2 3] len:2 cap:4
s2:[5] len:1 cap:1
另一種變體是除了指定low和high索引界限值,還指定容量的完整形式。
注意:字符串不支持完整切片表達(dá)式。
a[low:high:max]
上面的代碼會構(gòu)造與簡單切片表達(dá)式a[low:high]的類型、長度和元素相同的切片。
另外,它會將得到的結(jié)果切片的容量設(shè)置為max-low。
在完整切片表達(dá)式中只有第一個索引值(low)可以省略,該值默認(rèn)為0。
a := [5]int{1, 2, 3, 4, 5} s1 := a[1:3:4] // 通過額外指定max,控制切片的容量 fmt.Printf("s1:%v len:%v cap:%v\n", s1, len(s1), cap(s1)) s2 := a[1:3] fmt.Printf("s2:%v len:%v cap:%v\n", s2, len(s2), cap(s2))
輸出結(jié)果:
s1:[2 3] len:2 cap:3
s2:[2 3] len:2 cap:4
完整切片表達(dá)式需要滿足的條件是0 ≤ low ≤ high ≤ max ≤ cap(a),其他條件和簡單切片表達(dá)式相同。
03 go test cache
在包列表模式下,go test會緩存測試成功的包的測試結(jié)果,以避免運(yùn)行不必要的重復(fù)測試。
當(dāng)測試結(jié)果可以從緩存中獲取時,go test將直接顯示以前緩存的輸出,而不是再次運(yùn)行測試二進(jìn)制文件。
當(dāng)這種情況發(fā)生時,go test會輸出(cached)來代替摘要行中的運(yùn)行時間。
執(zhí)行兩次 go test . -v,從下面的輸出結(jié)果可以看到,第二次的輸出結(jié)果中有cached標(biāo)識。
? go test . -v === RUN TestSplit --- PASS: TestSplit (0.00s) PASS ok split 0.005s ? go test . -v === RUN TestSplit --- PASS: TestSplit (0.00s) PASS ok split (cached)
如果多次執(zhí)行測試時運(yùn)行的二進(jìn)制文件相同,并且命令行上的參數(shù)都是可緩存測試參數(shù)(-bachtime、-cpu、-list、-pallel、-run、-short、-timeout、-failfast和-v),就會匹配到緩存中的結(jié)果。
只要測試時添加了除上述可緩存參數(shù)外的任何參數(shù)就不會緩存結(jié)果,顯式禁用測試緩存的慣用方法是在命令行使用 -count=1 參數(shù)。
? go test . -v -count=1 === RUN TestSplit --- PASS: TestSplit (0.00s) PASS ok split 0.005s
04 JSON序列化時不轉(zhuǎn)義
json包中的encoder可以通過SetEscapeHTML指定是否應(yīng)該在JSON字符串中轉(zhuǎn)義有問題的HTML字符。
它默認(rèn)將&、<和>轉(zhuǎn)義為\u0026、\u003c和\u003e,以避免在HTML中嵌入JSON時出現(xiàn)安全問題。
如果在是非HTML場景下不想被轉(zhuǎn)義,那么可以通過SetEscapeHTML(false)禁用此行為。
例如,在有些業(yè)務(wù)場景下可能需要序列化帶查詢參數(shù)的URL,我們并不希望轉(zhuǎn)義&符號。
// URLInfo 一個包含URL字段的結(jié)構(gòu)體 type URLInfo struct { URL string // ... } func jsonEncodeDontEscapeHTML(data URLInfo) { // 默認(rèn)序列化時會轉(zhuǎn)義 &、<和> b, _ := json.Marshal(data) fmt.Printf("json.Marshal(data) result:%s\n", b) // 通過 SetEscapeHTML(false) 設(shè)置不轉(zhuǎn)義 buf := bytes.Buffer{} encoder := json.NewEncoder(&buf) encoder.SetEscapeHTML(false) encoder.Encode(data) fmt.Printf("encoder.Encode(data) result:%s\n", buf.String()) } func main() { jsonEncodeDontEscapeHTML(URLInfo{URL:"https://liwenzhou.com?name=q1mi&age=18"}) }
輸出結(jié)果如下:
json.Marshal(data)
result:{"URL":"https://liwenzhou.com?name=q1mi\u0026age=18"}
encoder.Encode(data)
result:{"URL":"https://liwenzhou.com?name=q1mi&age=18"}
以上就是Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率的詳細(xì)內(nèi)容,更多關(guān)于Go語言開發(fā)技巧的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄
gorm是目前用得最多的go語言orm庫,本文主要介紹了使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06go語言切片slice使用細(xì)節(jié)和注意事項整理大全
這篇文章主要給大家介紹了關(guān)于go語言切片slice使用細(xì)節(jié)和注意事項整理的相關(guān)資料,需要的朋友可以參考下2024-05-05Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度
這篇文章主要介紹了Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度,使用Go語言后,可以并發(fā)獲取,極大提升效率,需要的朋友可以參考下2023-02-02Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解
如果某個G執(zhí)行時間過長,其他的G如何才能被正常調(diào)度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識,需要的可以參考一下2023-04-04