go語言make初始化的實現
一:概述
在Go語言中,make是一個內建函數,用于初始化切片(slice)、映射(map)和通道(channel)。與new函數不同,make返回的是實際的對象,而非指向對象的指針。本文將深入探討make的工作原理,并提供一系列實際案例,幫助讀者更全面地理解和運用make。
二:具體說明
<1> make的工作原理
make函數的基本語法如下:
make(type, length, capacity)
- type:要創(chuàng)建的數據結構類型,只能是切片、映射或通道。
- length:數據結構的初始長度,對于切片和通道是必需的。
- capacity:數據結構的容量,對于切片是可選的,對于映射和通道是必需的。
1.1 切片的初始化
切片是Go語言中非常靈活的數據結構,make用于創(chuàng)建切片并初始化其底層數組。
// 創(chuàng)建一個長度為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: 51.2 映射的初始化
映射是Go語言中的鍵值對集合,make用于創(chuàng)建映射并初始化其底層哈希表。
// 創(chuàng)建一個空的字符串到整數的映射
m := make(map[string]int)
fmt.Println("Map:", m) // 輸出: Map: map[]
fmt.Println("Length:", len(m)) // 輸出: Length: 01.3 通道的初始化
通道是Go語言中的同步通信機制,make用于創(chuàng)建通道并初始化其緩沖區(qū)。
// 創(chuàng)建一個容量為3的整數通道
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的實際案例
2.1 切片的動態(tài)擴容
切片的動態(tài)擴容是Go語言中一個重要的特性,make可以預設容量以優(yōu)化性能。
s := make([]int, 0, 10) // 預設容量為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類型來實現并發(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ū)大小對于控制并發(fā)流程至關重要。
ch := make(chan int, 2) // 緩沖區(qū)大小為2
go func() {
for i := 0; i < 5; i++ {
ch <- i * 2 // 發(fā)送數據
}
close(ch) // 發(fā)送完畢后關閉通道
}()
for v := range ch {
fmt.Println("Received:", v) // 接收并打印數據
}<3> make與new的對比
- new(T)返回類型T的指針,即*T,而make(T)返回類型T的實例。
- new(T)不會對T進行初始化,而make(T)會根據類型進行初始化。
- make只能用于切片、映射和通道的初始化,而new可以用于任何類型的初始化。
<4>總結
make是Go語言中一個強大的工具,它提供了一種簡潔且高效的方式來初始化復雜的數據結構。通過合理使用make,可以提高程序的性能和可讀性。希望本文能夠幫助讀者更深入地理解make的用法,并在實際開發(fā)中靈活運用。
到此這篇關于go語言make初始化的實現的文章就介紹到這了,更多相關go語言make初始化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang基于websocket通信tcp keepalive研究記錄
這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
在golang xorm中使用postgresql的json,array類型的操作
這篇文章主要介紹了在golang xorm中使用postgresql的json,array類型的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

