go語(yǔ)言make初始化的實(shí)現(xiàn)
一:概述
在Go語(yǔ)言中,make是一個(gè)內(nèi)建函數(shù),用于初始化切片(slice)、映射(map)和通道(channel)。與new函數(shù)不同,make返回的是實(shí)際的對(duì)象,而非指向?qū)ο蟮闹羔?。本文將深入探討make的工作原理,并提供一系列實(shí)際案例,幫助讀者更全面地理解和運(yùn)用make。
二:具體說(shuō)明
<1> make的工作原理
make函數(shù)的基本語(yǔ)法如下:
make(type, length, capacity)
- type:要?jiǎng)?chuàng)建的數(shù)據(jù)結(jié)構(gòu)類(lèi)型,只能是切片、映射或通道。
- length:數(shù)據(jù)結(jié)構(gòu)的初始長(zhǎng)度,對(duì)于切片和通道是必需的。
- capacity:數(shù)據(jù)結(jié)構(gòu)的容量,對(duì)于切片是可選的,對(duì)于映射和通道是必需的。
1.1 切片的初始化
切片是Go語(yǔ)言中非常靈活的數(shù)據(jù)結(jié)構(gòu),make用于創(chuàng)建切片并初始化其底層數(shù)組。
// 創(chuàng)建一個(gè)長(zhǎng)度為3,容量為5的int類(lèi)型切片
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: 51.2 映射的初始化
映射是Go語(yǔ)言中的鍵值對(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: 01.3 通道的初始化
通道是Go語(yǔ)言中的同步通信機(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語(yǔ)言中一個(gè)重要的特性,make可以預(yù)設(shè)容量以?xún)?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ā)安全的,但可以通過(guò)sync包中的Map類(lèi)型來(lái)實(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)返回類(lèi)型T的指針,即*T,而make(T)返回類(lèi)型T的實(shí)例。
- new(T)不會(huì)對(duì)T進(jìn)行初始化,而make(T)會(huì)根據(jù)類(lèi)型進(jìn)行初始化。
- make只能用于切片、映射和通道的初始化,而new可以用于任何類(lèi)型的初始化。
<4>總結(jié)
make是Go語(yǔ)言中一個(gè)強(qiáng)大的工具,它提供了一種簡(jiǎn)潔且高效的方式來(lái)初始化復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。通過(guò)合理使用make,可以提高程序的性能和可讀性。希望本文能夠幫助讀者更深入地理解make的用法,并在實(shí)際開(kāi)發(fā)中靈活運(yùn)用。
到此這篇關(guān)于go語(yǔ)言make初始化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語(yǔ)言make初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go語(yǔ)言之重要數(shù)組類(lèi)型切片(slice)make,append函數(shù)解讀
- Go語(yǔ)言中new()和 make()的區(qū)別詳解
- GO語(yǔ)言make()分配用法實(shí)例
- Go語(yǔ)言中make和new函數(shù)的用法與區(qū)別
- GO語(yǔ)言make和new關(guān)鍵字的區(qū)別
- 詳解Go語(yǔ)言中make和new的區(qū)別
- Go語(yǔ)言使用make進(jìn)行內(nèi)存分配的代碼示例
- Go語(yǔ)言中make和new的區(qū)別及說(shuō)明
- Go語(yǔ)言中new與make的使用解讀
- Go語(yǔ)言make創(chuàng)建切片的五種方式
相關(guān)文章
golang基于websocket通信tcp keepalive研究記錄
這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
詳解Golang中使用map時(shí)的注意問(wèn)題
Golang中的map是一種數(shù)據(jù)結(jié)構(gòu),它允許你使用鍵值對(duì)的形式存儲(chǔ)和訪(fǎng)問(wèn)數(shù)據(jù),map在Go中是非排序的,提供了高效查找、插入和刪除元素的能力,特別是當(dāng)鍵是不可變類(lèi)型,本文給大家詳細(xì)介紹了Golang中使用map時(shí)的注意問(wèn)題,需要的朋友可以參考下2024-06-06
在golang xorm中使用postgresql的json,array類(lèi)型的操作
這篇文章主要介紹了在golang xorm中使用postgresql的json,array類(lèi)型的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
如何有效控制Go線(xiàn)程數(shù)實(shí)例探究
這篇文章主要為大家介紹了如何有效控制?Go?線(xiàn)程數(shù)的問(wèn)題探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

