-
如何確定一個(gè) Go 變量會(huì)被分配在哪里?
本文作者記錄了 Go 變量分配位置的觀測(cè)技巧和 Go 語(yǔ)言設(shè)計(jì)思路。 一、由 iter 包引發(fā)的疑問 最近在 GitHub 上偶然發(fā)現(xiàn)了 Brad Fitzpatrick 的 iter 包,整個(gè)包只有 一個(gè)函數(shù)(一行代碼): 但其中的一行注釋令人費(fèi)解: It does not cause any allocations. 1. 空結(jié)構(gòu)體 我們知道,struct{} 是空結(jié)構(gòu)體(empty struct)。關(guān)于空結(jié)構(gòu)體,Dave Cheney 在 The empty struct 中作了很好地闡述…
-
深入理解Golang Channel 結(jié)構(gòu)
Go 語(yǔ)言的 channel 底層是什么數(shù)據(jù)結(jié)構(gòu)?本文深入解析了 channel。 Golang 使用 Groutine 和 channels 實(shí)現(xiàn)了 CSP(Communicating Sequential Processes) 模型,channles?在 goroutine 的通信和同步中承擔(dān)著重要的角色。 在 GopherCon 2017 中,Golang 專家 Kavya 深入介紹了 Go Channels 的內(nèi)部機(jī)制,以及運(yùn)行時(shí)調(diào)度器和內(nèi)存管理系統(tǒng)是如何支持 Channel 的,本文根…
-
七步制作精簡(jiǎn)鏡像
目錄 介紹 鏡像層(Layers) 制作步驟 lab-1:初始化構(gòu)建 Redis 鏡像 lab-2:優(yōu)化基礎(chǔ)鏡像 lab-3:串聯(lián) Dockerfile 指令 lab-4:壓縮你的鏡像 lab-5:使用最精簡(jiǎn)的 base image lab-6:提取動(dòng)態(tài)鏈接的 .so 文件 lab-7:為 Go 應(yīng)用構(gòu)建精簡(jiǎn)鏡像 總結(jié) 參考 介紹 前段時(shí)間網(wǎng)易蜂巢曾經(jīng)推出蜂巢?Logo?T恤,用的正是 Docker 鏡像制作,最神奇的是,它最終的鏡像大小只有?585?字節(jié)。 有些鏡像都不是我們自己來打包的(比如…
-
淺談 Golang 鎖的應(yīng)用: sync包
Go 語(yǔ)言 sync 包中的鎖都在什么場(chǎng)景下用?怎么用?本文對(duì) sync 包內(nèi)的鎖做了梳理。 今天談一下鎖,以及 Go 里面 Sync 包里面自帶的各種鎖,說到鎖這個(gè)概念,在日常生活中,鎖是為了保護(hù)一些東西,比如門鎖、密碼箱鎖,可以理解對(duì)資源的保護(hù)。在編程里面,鎖也是為了保護(hù)資源,比如說對(duì)文件加鎖,同一時(shí)間只也許一個(gè)用戶修改,這種鎖一般叫作文件鎖。 實(shí)際開發(fā)中,鎖又可分為互斥鎖(排它鎖)、讀寫鎖、共享鎖、自旋鎖,甚至還有悲觀鎖、樂觀鎖這種說法。在 Mysql 數(shù)據(jù)庫(kù)里面鎖的應(yīng)用更多,比如行鎖、表…
-
Golang 閉包的實(shí)現(xiàn)
什么是閉包?什么場(chǎng)景下會(huì)用閉包?本文對(duì)?go 語(yǔ)言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式語(yǔ)言中的概念,沒有研究過函數(shù)式語(yǔ)言的用戶可能很難理解閉包的強(qiáng)大,相關(guān)的概念超出了本書的范圍。Go語(yǔ)言是支持閉包的,這里只是簡(jiǎn)單地講一下在Go語(yǔ)言中閉包是如何實(shí)現(xiàn)的。 函數(shù)f返回了一個(gè)函數(shù),返回的這個(gè)函數(shù),返回的這個(gè)函數(shù)就是一個(gè)閉包。這個(gè)函數(shù)中本身是沒有定義變量i的,而是引用了它所在的環(huán)境(函數(shù)f)中的變量i。 c1跟c2引用…
-
Go 可變參數(shù) ... parameters 讀這篇就夠了
Go 語(yǔ)言可變參數(shù)怎么用能最大化它的效用?本文對(duì)可變參數(shù)進(jìn)行了詳細(xì)介紹。 在實(shí)際開發(fā)中,總有一些函數(shù)的參數(shù)個(gè)數(shù)是在編碼過程中無(wú)法確定的,比如我們最常用的 fmt.Printf 和 fmt.Println: 當(dāng)你需要實(shí)現(xiàn)類似的接口時(shí),就需要我們的可變參數(shù)出場(chǎng)了。 golang 的可變參數(shù) 可變參數(shù)就是一個(gè)占位符,你可以將 1 個(gè)或者多個(gè)參數(shù)賦值給這個(gè)占位符,這樣不管實(shí)際參數(shù)的數(shù)量是多少,都能交給可變參數(shù)來處理,我們看一下可變參數(shù)的聲明: 可變參數(shù)使用 name ...Type 的形式聲明在函數(shù)的參…
-
深入淺出標(biāo)準(zhǔn)庫(kù) text/template 包
go 語(yǔ)言標(biāo)準(zhǔn)庫(kù) text/template 在 web 編程項(xiàng)目中經(jīng)常用到,本文詳細(xì)介紹了這個(gè)包的用法。 官方定義: Package template implements data-driven templates for generating textual output. template 包是數(shù)據(jù)驅(qū)動(dòng)的文本輸出模板,其實(shí)就是在寫好的模板中填充數(shù)據(jù)。 模板 什么是模板? 下面是一個(gè)簡(jiǎn)單的模板示例: {{ 和 }} 中間的句號(hào)?.?代表傳入模板的數(shù)據(jù),根據(jù)傳入的數(shù)據(jù)不同渲染不同的內(nèi)容。 .…
-
字節(jié)開源以Go為核心的項(xiàng)目,為何大廠都如此偏愛Go?
9月8日,字節(jié)跳動(dòng)正式宣布開源CloudWeGo,這是一套以Go 語(yǔ)言為核心中間件集合。字節(jié)相關(guān)技術(shù)負(fù)責(zé)人表示希望CloudWeGo能豐富云原生社區(qū)的Golang工具體系。 可以看出,字節(jié)內(nèi)部已有諸多用Go語(yǔ)言開發(fā)的成熟項(xiàng)目,基本上也已經(jīng)全員轉(zhuǎn)Go了。其實(shí)不只是字節(jié),阿里、騰訊、百度、B站等也都開始嘗試用Go來開發(fā)項(xiàng)目了,如果你想進(jìn)大廠,那么Go語(yǔ)言毫無(wú)疑問是最佳通行證。 為什么現(xiàn)在BAT大廠紛紛轉(zhuǎn)Go? Go有十分明顯的優(yōu)勢(shì) 許多大廠內(nèi)部需要構(gòu)建大型項(xiàng)目,而Go的高并發(fā)、高性能、高效率等優(yōu)勢(shì),…
-
Go 項(xiàng)目中常見的 10 種錯(cuò)誤
本文總結(jié)了10種 go 語(yǔ)言編成中可能導(dǎo)致性能下降的壞實(shí)踐。有代碼潔癖的同學(xué)來自我檢查吧! 這篇文章主要講述了我在 Go 項(xiàng)目中見到過的常見錯(cuò)誤清單,順序無(wú)關(guān)。 未知的Enum值 來看個(gè)簡(jiǎn)單的例子 在上面的代碼中,使用iota創(chuàng)建了一個(gè)enum類型,分別代指下面的狀態(tài)信息: 現(xiàn)在,我們假設(shè)Status?是一個(gè) JSON 請(qǐng)求中被Marshalled / Unmarshalled的一個(gè)屬性,我們可以設(shè)計(jì)出下面的數(shù)據(jù)結(jié)構(gòu): 然后,假設(shè)收到的Request 的接口返回值為: 到目前為止,沒有什么特殊的…
-
Golang 如何表示枚舉類型
go 語(yǔ)言枚舉類型是這么用的?在什么場(chǎng)景下會(huì)用到枚舉?本文對(duì) go 語(yǔ)言枚舉做了詳細(xì)講解。 枚舉,是一種重要的數(shù)據(jù)類型,由一組鍵值對(duì)組成,通常用來在編程語(yǔ)言中充當(dāng)常量的標(biāo)識(shí)符。在主流行編程語(yǔ)言如 c、 java 等,都有原生支持。在 go 中,大家卻找不到 enum 或者其它直接用來聲明枚舉類型的關(guān)鍵字。從熟悉其它編程語(yǔ)言的開發(fā)者轉(zhuǎn)用 go 編程,剛開始會(huì)比較難接受這種情況。其實(shí),如果你看到如何在 go 中表示枚舉類型時(shí),可能會(huì)感受到 go 語(yǔ)言設(shè)計(jì)者對(duì)簡(jiǎn)潔性、問題考慮的深度,是一般資淺工程師無(wú)…