亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

引言

近年來,Go語言迅速占領了開發(fā)領域的重要地位,成為眾多公司和開發(fā)者的首選語言。

其簡捷、高效、并發(fā)性強的特點使得它在處理大型系統(tǒng)和復雜工程問題時表現(xiàn)出色,為開發(fā)者提供了良好的體驗。

隨著云計算、容器化、微服務、服務網(wǎng)格等技術的興起,Go語言的應用場景愈發(fā)廣泛,這也進一步推動其社區(qū)的繁榮和發(fā)展。

可以預見,Go語言的發(fā)展前景將會更加廣闊。

本文分享幾個你可能不知道的Go語言小細節(jié),希望能幫助大家更好地學習這門語言~~

01 數(shù)字字面量

Go語言中聲明數(shù)字變量時,可以使用數(shù)字字面量讓開發(fā)者以二進制、八進制或十六進制浮點數(shù)的格式定義數(shù)字。例如:

v1 := 0b00101101 // 二進制字面量 

v2 := 0o377      // 八進制字面量 

v3 := 0x1p-2     // 十六進制浮點字面量 

v4 := 01e2       // 十進制浮點字面量

在表達數(shù)字字面量時,可以使用_分隔數(shù)字。例如:

v5 := 123_456  // 可以使用_分隔數(shù)字

02 切片表達式

切片表達式指從字符串、數(shù)組、指向數(shù)組或切片的指針構造子字符串或切片。

它有兩種變體,其中一種是指定low和high兩個索引界限值。

由于切片的底層是數(shù)組,所以我們可以基于數(shù)組通過切片表達式得到切片,切片表達式中的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

方便起見,可以省略切片表達式中的任何索引。如果省略low則默認為0,如果省略high則默認為切片操作數(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í)行切片表達式時(切片再切片),high的上限是切片的容量cap(a),而不是長度。

常量索引必須是非負的,并且可以用int類型的值表示。

對于數(shù)組或常量字符串,常量索引必須在有效范圍內(nèi)。

如果low和high兩個指標都是常數(shù),則它們必須滿足low≤high。

如果索引在運行時超出范圍,就會發(fā)生運行時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索引界限值,還指定容量的完整形式。

注意:字符串不支持完整切片表達式。

a[low:high:max]

上面的代碼會構造與簡單切片表達式a[low:high]的類型、長度和元素相同的切片。

另外,它會將得到的結果切片的容量設置為max-low。

在完整切片表達式中只有第一個索引值(low)可以省略,該值默認為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))

輸出結果:

s1:[2 3] len:2 cap:3

s2:[2 3] len:2 cap:4

完整切片表達式需要滿足的條件是0 ≤ low ≤ high ≤ max ≤ cap(a),其他條件和簡單切片表達式相同。

03 go test cache

在包列表模式下,go test會緩存測試成功的包的測試結果,以避免運行不必要的重復測試。

當測試結果可以從緩存中獲取時,go test將直接顯示以前緩存的輸出,而不是再次運行測試二進制文件。

當這種情況發(fā)生時,go test會輸出(cached)來代替摘要行中的運行時間。 

執(zhí)行兩次 go test . -v,從下面的輸出結果可以看到,第二次的輸出結果中有cached標識。

? 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í)行測試時運行的二進制文件相同,并且命令行上的參數(shù)都是可緩存測試參數(shù)(-bachtime、-cpu、-list、-pallel、-run、-short、-timeout、-failfast和-v),就會匹配到緩存中的結果。

只要測試時添加了除上述可緩存參數(shù)外的任何參數(shù)就不會緩存結果,顯式禁用測試緩存的慣用方法是在命令行使用 -count=1 參數(shù)。

? go test . -v -count=1
=== RUN   TestSplit
--- PASS: TestSplit (0.00s)
PASS
ok   split 0.005s

04 JSON序列化時不轉義

json包中的encoder可以通過SetEscapeHTML指定是否應該在JSON字符串中轉義有問題的HTML字符。

它默認將&、<和>轉義為\u0026、\u003c和\u003e,以避免在HTML中嵌入JSON時出現(xiàn)安全問題。

如果在是非HTML場景下不想被轉義,那么可以通過SetEscapeHTML(false)禁用此行為。

例如,在有些業(yè)務場景下可能需要序列化帶查詢參數(shù)的URL,我們并不希望轉義&符號。

// URLInfo 一個包含URL字段的結構體
type URLInfo struct {
URL string
// ...
}
func jsonEncodeDontEscapeHTML(data URLInfo) {
// 默認序列化時會轉義 &、<和>
b, _ := json.Marshal(data)
fmt.Printf("json.Marshal(data) result:%s\n", b)
// 通過 SetEscapeHTML(false) 設置不轉義
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"})
}

輸出結果如下:

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ā)技巧必知的小細節(jié)提升效率的詳細內(nèi)容,更多關于Go語言開發(fā)技巧的資料請關注腳本之家其它相關文章!

相關文章

  • 使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄

    使用Gorm操作Oracle數(shù)據(jù)庫踩坑記錄

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

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

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

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

    這篇文章主要給大家介紹了關于go語言切片slice使用細節(jié)和注意事項整理的相關資料,需要的朋友可以參考下
    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)存逃逸,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 詳解Go語言中切片的長度與容量的區(qū)別

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

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

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

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

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

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

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

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

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

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

最新評論