從零開始:使用make函數創建資料結構

更新於 發佈於 閱讀時間約 5 分鐘


raw-image

👨‍💻簡介

make函數在slice、map和之後會介紹到的channel的初始化中扮演著關鍵的角色。本文將會簡單介紹make函數的用法,以及在初始化不同資料結構時的差異,讓你更好地理解和利用make函數。

make函數基本概念

首先,讓我們來了解一下make函數的基本概念。在Go中,make函數用於動態分配記憶體並初始化slice、map和channel。

// 創建一個切片,長度為5,容量為10
mySlice := make([]int, 5, 10)

在上面的範例中,我們使用make函數創建了一個整數切片(slice),其長度為5,容量為10。這意味著切片可以容納5個元素,但它的底層陣列的容量是10,這為後續的操作提供了一定的靈活性。

make函數的語法

make函數的語法相對簡單。它的一般形式是:

make(類型, 長度, 容量)
  • 類型:指定要創建的資料類型,可以是切片、map或通道。
  • 長度:表示資料結構的初始長度。
  • 容量:只適用於切片和通道,表示底層陣列的容量。

使用make初始化切片

接下來,讓我們看看如何使用make函數初始化切片。

// 創建一個整數切片,長度為3,容量為5
mySlice := make([]int, 3, 5)
mySlice[0] = 1
mySlice[1] = 2
mySlice[2] = 3

在這個例子中,我們首先使用make函數創建了一個長度為3、容量為5的整數切片。然後,我們分配了三個整數值到切片中。

使用make初始化Map

現在,讓我們看看如何使用make函數初始化Map。map是一種鍵值對的資料結構,非常適合用於存儲關聯性資料。

// 創建一個字符串到整數的map
myMap := make(map[string]int)
myMap["apple"] = 1
myMap["banana"] = 2
myMap["cherry"] = 3

在這個範例中,我們使用make函數創建了一個空的字符串到整數的map,然後添加了三個鍵值對。

make 函數在 Go 語言中常見用法包括初始化切片、map和通道。然而,它的使用也受到一些限制和約束。以下是 make 函數的常見用法以及相關的使用限制:

使用make初始化通道

最後,我們來看看如何使用make函數初始化通道。通道是Go語言中用於並發通信的重要機制。

// 創建一個通道,用於傳輸字符串資料
myChannel := make(chan string)
go func() {
myChannel <- "Hello"
myChannel <- "World"
}()

在這個例子中,我們使用make函數創建了一個通道,它可以傳輸字符串資料。然後,我們使用Go協程向通道發送了兩個字符串。

使用限制

  1. 只能用於切片、map和通道make 函數只能用於初始化切片、map和通道,不能用於其他資料類型或自定義類型的初始化。
  2. 切片容量必須大於等於長度:在使用 make 初始化切片時,切片的容量必須大於等於長度。否則,會導致運行時錯誤。
// 正確的範例 
mySlice := make([]int, 5, 10)

// 錯誤的範例,容量小於長度
mySlice := make([]int, 10, 5) // 這會導致運行時錯誤

3. Map無需指定容量:與切片不同,map的容量無需顯示指定,因為map會根據需要動態擴展。

myMap := make(map[string]int) // 正確的初始化map,無需指定容量

4. 通道的容量是可選的:通道的容量是可選的,你可以選擇在創建通道時指定容量,也可以不指定。

myChannel := make(chan int)     // 創建一個無緩衝通道 
myBufferedChannel := make(chan int, 10) // 創建一個有緩衝容量為 10 的通道

5. 通道需要關閉:如果你使用 make 創建的通道,需要負責在適當的時候關閉通道,以避免死鎖。

close(myChannel)

make 函數是 Go 語言中用於初始化切片、map和通道的重要工具,但它有一些使用限制,需要按照上述規則使用,以確保程序的正確性和性能。

make函數的注意事項

在使用make函數時,有一些注意事項。首先,要確保選擇適當的長度和容量,以避免不必要的記憶體浪費。其次,根據你的需求,選擇切片、map或通道來存儲和處理資料。最後,記得釋放不再使用的資料結構,以避免記憶體洩漏。

📚Reference





留言
avatar-img
留言分享你的想法!
avatar-img
Alan的開發者天地
18會員
83內容數
golang
Alan的開發者天地的其他內容
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
資料型態-變數概念 上面這張圖片傳傳達了三個概念, 常值:可以是數值、浮點數、字串、布林等資料, 變數名稱:這邊也很好理解,就是好記得名稱,這邊使用中文是方便初學者入門, 盒子:代表在Python底層運作的狀況,Python創建變數時,會先在記憶體創建型態物件,這邊是數字型態,所以創建數字物件。
Thumbnail
👨‍💻簡介 make函數在slice、map和之後會介紹到的channel的初始化中扮演著關鍵的角色。本文將會簡單介紹make函數的用法,以及在初始化不同資料結構時的差異,讓你更好地理解和利用make函數。
Thumbnail
👨‍💻簡介 make函數在slice、map和之後會介紹到的channel的初始化中扮演著關鍵的角色。本文將會簡單介紹make函數的用法,以及在初始化不同資料結構時的差異,讓你更好地理解和利用make函數。
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
Thumbnail
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
Thumbnail
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
Thumbnail
這篇文章為介紹C#基礎知識的一部分,如果你是直接開始寫程式的C#程式員,可以看看這篇文章補足一些基礎知識。
Thumbnail
這篇文章為介紹C#基礎知識的一部分,如果你是直接開始寫程式的C#程式員,可以看看這篇文章補足一些基礎知識。
Thumbnail
函式(Function)、傳值法、傳位址法、傳參考法
Thumbnail
函式(Function)、傳值法、傳位址法、傳參考法
Thumbnail
變數(variable)、型別(type)、初始化(initialize)、宣告
Thumbnail
變數(variable)、型別(type)、初始化(initialize)、宣告
Thumbnail
本文詳述模板設計的思路以及仔細講解函數分析,作者本人是文組背景,非常明白函數這個在 Notion 中最需要學習成本的項目帶來的痛點,本文即使函數小白也能輕鬆看懂。本文介紹format()函數、add()函數、 concat()函數和floor()。
Thumbnail
本文詳述模板設計的思路以及仔細講解函數分析,作者本人是文組背景,非常明白函數這個在 Notion 中最需要學習成本的項目帶來的痛點,本文即使函數小白也能輕鬆看懂。本文介紹format()函數、add()函數、 concat()函數和floor()。
Thumbnail
至今為止,本文都使用代數的方式來討論微分,並以生活、科學中的瞬間變化率,如:速度等,對微分的定義做出詮釋,這篇文章則將用幾何角度來了解函數微分。上文已引入代數和幾何的觀念;概略介紹函數的圖形定義;本篇文章則從字源學引入割線的概念,若未讀過上篇的讀者,可按此連結上篇。
Thumbnail
至今為止,本文都使用代數的方式來討論微分,並以生活、科學中的瞬間變化率,如:速度等,對微分的定義做出詮釋,這篇文章則將用幾何角度來了解函數微分。上文已引入代數和幾何的觀念;概略介紹函數的圖形定義;本篇文章則從字源學引入割線的概念,若未讀過上篇的讀者,可按此連結上篇。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News