2023-09-04|閱讀時間 ‧ 約 5 分鐘

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


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





分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.