關於golang的make
以下由golang教學專欄來介紹golang的make,希望對需要的朋友有幫助!
golang 分配記憶體主要有內建函數new和make,今天我們來探究make有哪些玩法。
map只能為slice, map, channel分配內存,並傳回一個初始化的值。首先來看下make有以下三種不同的用法:
1. make(map[string]string)
2. make([]int, 2)
3. make([]int, 2, 4)
1. 第一種用法,即缺少長度的參數,只傳類型,這種用法只能用在類型為map或chan的場景,例如make([]int)是會報錯的。這樣回傳的空間長度都是預設為0的。
2. 第二種用法,指定了長度,例如make([]int, 2)傳回的是一個長度為2的slice
3. 第三種用法,第二參數指定的是切片的長度,第三個參數是用來指定預留的空間長度,例如a := make([]int, 2, 4), 這裡值得注意的是傳回的切片a的總長度是4,預留的意思並不是另外多出來4的長度,其實是包含了前面2個已經切片的個數的。所以舉個例子當你這樣用的時候 a := make([]int, 4, 2),就會報到語法錯誤。
因此,當我們為slice分配記憶體的時候,應當盡量預估到slice可能的最大長度,透過給make傳第三個參數的方式來為slice預留好記憶體空間,這樣可以避免二次分配記憶體帶來的開銷,大幅提升程式的效能。
而事實上,我們其實是很難預估切片的可能的最大長度的,這種情況下,當我們調用append為slice追加元素時,golang為了盡可能的減少二次分配內存,並不是每次都只增加一個單位的記憶體空間,而且遵循這樣一種擴容機制:
當有預留的未使用的空間時,直接對未使用的空間進行切片追加,當預留的空間全部使用完畢的時候,擴容的空間將會是目前的slice長度的一倍,例如目前slice的長度為4,進行一次append操作之後,cap(a)返回的長度將會是8.來看下面這段示範程式碼:
package main import ( "fmt") func main() { a := make([]int, 0) n := 20 for i := 0; i < n; i++ { a = append(a, 1) fmt.Printf("len=%d cap=%d\n", len(a), cap(a)) } } Output: len=1 cap=1 // 第一次扩容len=2 cap=2 // 第二次扩容len=3 cap=4 // 第三次扩容len=4 cap=4len=5 cap=8 // 第四次扩容len=6 cap=8len=7 cap=8len=8 cap=8len=9 cap=16 // 第五次扩容len=10 cap=16len=11 cap=16len=12 cap=16len=13 cap=16len=14 cap=16len=15 cap=16len=16 cap=16len=17 cap=32 // 第六次扩容len=18 cap=32len=19 cap=32len=20 cap=32
以上測試結果表明,每次擴容後,記憶體空間長度會變成原來的兩倍。
好奇的我想試一下,如果一直這樣擴展下去的話,理論上會呈指數擴展,然而事實真的會這樣嗎,我繼續進行append操作,後續的輸出是這樣的:
0 0 1 1 2 2 4 4 8 8 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 1312 1312 // 288 1696 1696 // 384 2208 2208 // 512 3072 3072 // 864 4096 4096 // 1024 5120 5120 // 1024 7168 7168 // 2048 9216 9216 // 2048
上面的輸出忽略掉了中間沒有擴容的情況。可以看到,前11次擴容確實是每次擴展一倍的長度,不過第12次擴容,明顯沒有如預期擴展到2048。
以上是關於golang的make的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在Go中安全地讀取和寫入檔案至關重要。指南包括:檢查檔案權限使用defer關閉檔案驗證檔案路徑使用上下文逾時遵循這些準則可確保資料的安全性和應用程式的健全性。

如何為Go資料庫連線配置連線池?使用database/sql包中的DB類型建立資料庫連線;設定MaxOpenConns以控制最大並發連線數;設定MaxIdleConns以設定最大空閒連線數;設定ConnMaxLifetime以控制連線的最大生命週期。

可以透過使用gjson函式庫或json.Unmarshal函數將JSON資料儲存到MySQL資料庫中。 gjson函式庫提供了方便的方法來解析JSON字段,而json.Unmarshal函數需要一個目標類型指標來解組JSON資料。這兩種方法都需要準備SQL語句和執行插入操作來將資料持久化到資料庫中。

GoLang框架與Go框架的差異體現在內部架構與外部特性。 GoLang框架基於Go標準函式庫,擴充其功能,而Go框架由獨立函式庫組成,以實現特定目的。 GoLang框架更靈活,Go框架更容易上手。 GoLang框架在效能上稍有優勢,Go框架的可擴充性更高。案例:gin-gonic(Go框架)用於建立RESTAPI,而Echo(GoLang框架)用於建立Web應用程式。

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

FindStringSubmatch函數可找出正規表示式匹配的第一個子字串:此函數傳回包含匹配子字串的切片,第一個元素為整個匹配字串,後續元素為各個子字串。程式碼範例:regexp.FindStringSubmatch(text,pattern)傳回符合子字串的切片。實戰案例:可用於匹配電子郵件地址中的域名,例如:email:="user@example.com",pattern:=@([^\s]+)$獲取域名match[1]。

Go框架開發常見問題:框架選擇:取決於應用需求和開發者偏好,如Gin(API)、Echo(可擴展)、Beego(ORM)、Iris(效能)。安裝和使用:使用gomod指令安裝,導入框架並使用。資料庫互動:使用ORM庫,如gorm,建立資料庫連線和操作。身份驗證和授權:使用會話管理和身份驗證中間件,如gin-contrib/sessions。實戰案例:使用Gin框架建立一個簡單的部落格API,提供POST、GET等功能。

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...
