欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率

 更新時間:2024年01月11日 11:17:39   作者:Go語言中文網(wǎng)  
這篇文章主要介紹了Go語言開發(fā)技巧必知的小細(xì)節(jié)提升效率,分享幾個你可能不知道的Go語言小細(xì)節(jié),希望能幫助大家更好地學(xué)習(xí)這門語言

引言

近年來,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操作Oracle數(shù)據(jù)庫踩坑記錄

    gorm是目前用得最多的go語言orm庫,本文主要介紹了使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • GoLang與Java各自生成grpc代碼流程介紹

    GoLang與Java各自生成grpc代碼流程介紹

    這篇文章主要介紹了GoLang與Java各自生成grpc代碼流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • go語言切片slice使用細(xì)節(jié)和注意事項整理大全

    go語言切片slice使用細(xì)節(jié)和注意事項整理大全

    這篇文章主要給大家介紹了關(guān)于go語言切片slice使用細(xì)節(jié)和注意事項整理的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度

    Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度

    這篇文章主要介紹了Go使用協(xié)程批量獲取數(shù)據(jù)加快接口返回速度,使用Go語言后,可以并發(fā)獲取,極大提升效率,需要的朋友可以參考下
    2023-02-02
  • 淺談Golang內(nèi)存逃逸

    淺談Golang內(nèi)存逃逸

    本文主要介紹了Golang內(nèi)存逃逸,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解Go語言中切片的長度與容量的區(qū)別

    詳解Go語言中切片的長度與容量的區(qū)別

    切片可以看成是數(shù)組的引用,切片的長度是它所包含的元素個數(shù)。切片的容量是從它的第一個元素到其底層數(shù)組元素末尾的個數(shù)。本文將通過示例詳細(xì)講講Go語言中切片的長度與容量的區(qū)別,需要的可以參考一下
    2022-11-11
  • Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    Go調(diào)度器學(xué)習(xí)之協(xié)作與搶占詳解

    如果某個G執(zhí)行時間過長,其他的G如何才能被正常調(diào)度,這就引出了接下來的話題:協(xié)作與搶占。本文將通過一些示例為大家詳細(xì)講講調(diào)度器中協(xié)作與搶占的相關(guān)知識,需要的可以參考一下
    2023-04-04
  • 解析Golang和Java的優(yōu)勢與劣勢

    解析Golang和Java的優(yōu)勢與劣勢

    Golang和Java是兩種流行的編程語言,它們在很多方面有著相似之處,但也存在一些重要的區(qū)別,本文將對Golang和Java進(jìn)行對比,探討它們的特點(diǎn)和適用場景,需要的朋友可以參考下
    2023-10-10
  • golang 執(zhí)行命令行的實現(xiàn)

    golang 執(zhí)行命令行的實現(xiàn)

    本文主要介紹了golang 執(zhí)行命令行的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • golang gin框架獲取參數(shù)的操作

    golang gin框架獲取參數(shù)的操作

    這篇文章主要介紹了golang gin框架獲取參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論