go語言make初始化的實(shí)現(xiàn)
一:概述
在Go語言中,make是一個(gè)內(nèi)建函數(shù),用于初始化切片(slice)、映射(map)和通道(channel)。與new函數(shù)不同,make返回的是實(shí)際的對(duì)象,而非指向?qū)ο蟮闹羔槨1疚膶⑸钊胩接憁ake的工作原理,并提供一系列實(shí)際案例,幫助讀者更全面地理解和運(yùn)用make。
二:具體說明
<1> make的工作原理
make函數(shù)的基本語法如下:
make(type, length, capacity)
- type:要?jiǎng)?chuàng)建的數(shù)據(jù)結(jié)構(gòu)類型,只能是切片、映射或通道。
- length:數(shù)據(jù)結(jié)構(gòu)的初始長度,對(duì)于切片和通道是必需的。
- capacity:數(shù)據(jù)結(jié)構(gòu)的容量,對(duì)于切片是可選的,對(duì)于映射和通道是必需的。
1.1 切片的初始化
切片是Go語言中非常靈活的數(shù)據(jù)結(jié)構(gòu),make用于創(chuàng)建切片并初始化其底層數(shù)組。
// 創(chuàng)建一個(gè)長度為3,容量為5的int類型切片 s := make([]int, 3, 5) fmt.Println("Slice:", s) // 輸出: Slice: [0 0 0] fmt.Println("Length:", len(s)) // 輸出: Length: 3 fmt.Println("Capacity:", cap(s)) // 輸出: Capacity: 5
1.2 映射的初始化
映射是Go語言中的鍵值對(duì)集合,make用于創(chuàng)建映射并初始化其底層哈希表。
// 創(chuàng)建一個(gè)空的字符串到整數(shù)的映射 m := make(map[string]int) fmt.Println("Map:", m) // 輸出: Map: map[] fmt.Println("Length:", len(m)) // 輸出: Length: 0
1.3 通道的初始化
通道是Go語言中的同步通信機(jī)制,make用于創(chuàng)建通道并初始化其緩沖區(qū)。
// 創(chuàng)建一個(gè)容量為3的整數(shù)通道 ch := make(chan int, 3) fmt.Println("Channel:", ch) // 輸出: Channel: 0x00 fmt.Println("Length:", len(ch)) // 輸出: Length: 0 fmt.Println("Capacity:", cap(ch)) // 輸出: Capacity: 3
<2>make的實(shí)際案例
2.1 切片的動(dòng)態(tài)擴(kuò)容
切片的動(dòng)態(tài)擴(kuò)容是Go語言中一個(gè)重要的特性,make可以預(yù)設(shè)容量以優(yōu)化性能。
s := make([]int, 0, 10) // 預(yù)設(shè)容量為10 for i := 0; i < 15; i++ { s = append(s, i) } fmt.Println("Slice:", s) // 輸出: Slice: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
2.2 映射的并發(fā)安全
映射本身不是并發(fā)安全的,但可以通過sync包中的Map類型來實(shí)現(xiàn)并發(fā)安全。
var m sync.Map m.Store("key", 1) if v, ok := m.Load("key"); ok { fmt.Println("Value:", v) // 輸出: Value: 1 }
2.3 通道的緩沖區(qū)控制
通道的緩沖區(qū)大小對(duì)于控制并發(fā)流程至關(guān)重要。
ch := make(chan int, 2) // 緩沖區(qū)大小為2 go func() { for i := 0; i < 5; i++ { ch <- i * 2 // 發(fā)送數(shù)據(jù) } close(ch) // 發(fā)送完畢后關(guān)閉通道 }() for v := range ch { fmt.Println("Received:", v) // 接收并打印數(shù)據(jù) }
<3> make與new的對(duì)比
- new(T)返回類型T的指針,即*T,而make(T)返回類型T的實(shí)例。
- new(T)不會(huì)對(duì)T進(jìn)行初始化,而make(T)會(huì)根據(jù)類型進(jìn)行初始化。
- make只能用于切片、映射和通道的初始化,而new可以用于任何類型的初始化。
<4>總結(jié)
make是Go語言中一個(gè)強(qiáng)大的工具,它提供了一種簡潔且高效的方式來初始化復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。通過合理使用make,可以提高程序的性能和可讀性。希望本文能夠幫助讀者更深入地理解make的用法,并在實(shí)際開發(fā)中靈活運(yùn)用。
到此這篇關(guān)于go語言make初始化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言make初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode配置go開發(fā)環(huán)境的實(shí)戰(zhàn)過程
vscode配置go的開發(fā)環(huán)境很簡單,下面這篇文章主要給大家介紹了關(guān)于vscode配置go開發(fā)環(huán)境的實(shí)戰(zhàn)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06提升Golang應(yīng)用性能:深入理解Context的應(yīng)用
本文將深入探討如何通過深入理解和正確應(yīng)用Go語言中的Context來提升應(yīng)用性能。需要的朋友可以參考下2023-09-09Golang中如何對(duì)MySQL進(jìn)行操作詳解
這篇文章主要給大家介紹了關(guān)于在Golang中如何對(duì)MySQL進(jìn)行操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Go?語言進(jìn)階freecache源碼學(xué)習(xí)教程
這篇文章主要為大家介紹了Go?語言進(jìn)階freecache源碼學(xué)習(xí)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04