Go語(yǔ)言使用make進(jìn)行內(nèi)存分配的代碼示例
make 函數(shù)的基本概念
語(yǔ)法與適用類型
make 函數(shù)的語(yǔ)法格式為 make(T, args),其中 T 代表要?jiǎng)?chuàng)建的類型,必須是切片、映射或通道這三種引用類型之一,args 是根據(jù)不同類型而定的參數(shù)。以下是三種類型使用 make 函數(shù)的基本形式:
- 切片:
make([]T, length, capacity),其中T是切片元素的類型,length是切片的初始長(zhǎng)度,capacity是切片的初始容量(可省略,默認(rèn)與長(zhǎng)度相同)。 - 映射:
make(map[K]V, initialCapacity),K是鍵的類型,V是值的類型,initialCapacity是映射的初始容量(可省略)。 - 通道:
make(chan T, bufferSize),T是通道中元素的類型,bufferSize是通道的緩沖區(qū)大?。墒÷?,省略時(shí)為無緩沖通道)。
代碼示例
package main
import "fmt"
func main() {
// 使用 make 創(chuàng)建切片
slice := make([]int, 3, 5)
fmt.Printf("切片長(zhǎng)度: %d, 容量: %d, 內(nèi)容: %v\n", len(slice), cap(slice), slice)
// 使用 make 創(chuàng)建映射
m := make(map[string]int)
m["apple"] = 1
m["banana"] = 2
fmt.Println("映射內(nèi)容:", m)
// 使用 make 創(chuàng)建通道
ch := make(chan int, 2)
ch <- 10
ch <- 20
fmt.Println("從通道接收:", <-ch)
}
在上述代碼中,分別使用 make 函數(shù)創(chuàng)建了切片、映射和通道,并進(jìn)行了簡(jiǎn)單的操作。
切片的 make 分配
長(zhǎng)度與容量的區(qū)別
在使用 make 創(chuàng)建切片時(shí),長(zhǎng)度和容量是兩個(gè)重要的概念。長(zhǎng)度表示切片中當(dāng)前元素的數(shù)量,而容量表示切片底層數(shù)組的大小。可以通過 len() 函數(shù)獲取切片的長(zhǎng)度,通過 cap() 函數(shù)獲取切片的容量。
package main
import "fmt"
func main() {
// 創(chuàng)建一個(gè)長(zhǎng)度為 2,容量為 5 的切片
slice := make([]int, 2, 5)
fmt.Printf("初始長(zhǎng)度: %d, 初始容量: %d\n", len(slice), cap(slice))
// 向切片追加元素
slice = append(slice, 1, 2, 3)
fmt.Printf("追加元素后長(zhǎng)度: %d, 容量: %d, 內(nèi)容: %v\n", len(slice), cap(slice), slice)
}
在這個(gè)示例中,初始創(chuàng)建的切片長(zhǎng)度為 2,容量為 5。當(dāng)使用 append 函數(shù)追加元素時(shí),如果長(zhǎng)度超過了容量,Go 語(yǔ)言會(huì)自動(dòng)重新分配更大的底層數(shù)組。
項(xiàng)目場(chǎng)景:數(shù)據(jù)處理
在數(shù)據(jù)處理項(xiàng)目中,我們可能需要?jiǎng)討B(tài)地處理一批數(shù)據(jù)。使用 make 創(chuàng)建切片可以預(yù)先分配一定的容量,減少內(nèi)存重新分配的次數(shù),提高性能。
package main
import (
"fmt"
)
func processData() []int {
// 預(yù)先分配容量為 100 的切片
data := make([]int, 0, 100)
for i := 0; i < 100; i++ {
data = append(data, i)
}
return data
}
func main() {
result := processData()
fmt.Println("處理后的數(shù)據(jù):", result)
}
映射的 make 分配
初始容量的作用
在使用 make 創(chuàng)建映射時(shí),指定初始容量可以提高映射的性能。如果預(yù)先知道映射可能存儲(chǔ)的元素?cái)?shù)量,指定合適的初始容量可以減少哈希表擴(kuò)容的次數(shù)。
package main
import "fmt"
func main() {
// 創(chuàng)建一個(gè)初始容量為 10 的映射
m := make(map[string]int, 10)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("key%d", i)
m[key] = i
}
fmt.Println("映射內(nèi)容:", m)
}
項(xiàng)目場(chǎng)景:緩存系統(tǒng)
在緩存系統(tǒng)中,映射可以用于存儲(chǔ)緩存數(shù)據(jù)。使用 make 創(chuàng)建映射并指定合適的初始容量,可以提高緩存系統(tǒng)的性能。
package main
import (
"fmt"
)
type Cache struct {
data map[string]interface{}
}
func NewCache(capacity int) *Cache {
return &Cache{
data: make(map[string]interface{}, capacity),
}
}
func (c *Cache) Set(key string, value interface{}) {
c.data[key] = value
}
func (c *Cache) Get(key string) (interface{}, bool) {
val, exists := c.data[key]
return val, exists
}
func main() {
cache := NewCache(20)
cache.Set("item1", 100)
val, exists := cache.Get("item1")
if exists {
fmt.Println("緩存中獲取的值:", val)
}
}
通道的 make 分配
有緩沖通道與無緩沖通道
使用 make 創(chuàng)建通道時(shí),可以指定緩沖區(qū)大小。如果不指定緩沖區(qū)大小,創(chuàng)建的是無緩沖通道,發(fā)送和接收操作會(huì)阻塞;如果指定了緩沖區(qū)大小,創(chuàng)建的是有緩沖通道,只有當(dāng)緩沖區(qū)滿時(shí)發(fā)送操作才會(huì)阻塞,只有當(dāng)緩沖區(qū)為空時(shí)接收操作才會(huì)阻塞。
package main
import "fmt"
func main() {
// 創(chuàng)建無緩沖通道
ch1 := make(chan int)
go func() {
ch1 <- 10
fmt.Println("數(shù)據(jù)已發(fā)送到無緩沖通道")
}()
fmt.Println("從無緩沖通道接收:", <-ch1)
// 創(chuàng)建有緩沖通道
ch2 := make(chan int, 2)
ch2 <- 20
ch2 <- 30
fmt.Println("從有緩沖通道接收:", <-ch2)
}
項(xiàng)目場(chǎng)景:并發(fā)任務(wù)處理
在并發(fā)任務(wù)處理中,通道可以用于協(xié)程之間的通信。使用 make 創(chuàng)建合適的通道可以協(xié)調(diào)不同協(xié)程的工作。
package main
import (
"fmt"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Printf("Worker %d 開始處理任務(wù) %d\n", id, j)
results <- j * 2
}
}
func main() {
const numJobs = 5
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
// 啟動(dòng) 3 個(gè)工作協(xié)程
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 發(fā)送任務(wù)
for j := 1; j <= numJobs; j++ {
jobs <- j
}
close(jobs)
// 收集結(jié)果
for a := 1; a <= numJobs; a++ {
<-results
}
close(results)
}
總結(jié)
make 函數(shù)在 Go 語(yǔ)言中是為切片、映射和通道進(jìn)行內(nèi)存分配和初始化的重要工具。通過合理使用 make 函數(shù),可以根據(jù)不同的需求為這些引用類型分配合適的內(nèi)存,提高程序的性能和效率。在實(shí)際項(xiàng)目中,無論是數(shù)據(jù)處理、緩存系統(tǒng)還是并發(fā)任務(wù)處理,make 函數(shù)都發(fā)揮著關(guān)鍵作用。開發(fā)者需要深入理解 make 函數(shù)的使用方法和不同類型的特點(diǎn),根據(jù)具體的場(chǎng)景靈活運(yùn)用。
以上就是Go語(yǔ)言使用make進(jìn)行內(nèi)存分配的代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Go make內(nèi)存分配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Go語(yǔ)言之重要數(shù)組類型切片(slice)make,append函數(shù)解讀
- Go語(yǔ)言中new()和 make()的區(qū)別詳解
- GO語(yǔ)言make()分配用法實(shí)例
- go語(yǔ)言make初始化的實(shí)現(xiàn)
- Go語(yǔ)言中make和new函數(shù)的用法與區(qū)別
- GO語(yǔ)言make和new關(guān)鍵字的區(qū)別
- 詳解Go語(yǔ)言中make和new的區(qū)別
- Go語(yǔ)言中make和new的區(qū)別及說明
- Go語(yǔ)言中new與make的使用解讀
- Go語(yǔ)言make創(chuàng)建切片的五種方式
相關(guān)文章
go build -tags構(gòu)建約束試驗(yàn)示例解析
這篇文章主要為大家介紹了go build -tags構(gòu)建約束試驗(yàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
go語(yǔ)言vscode集成開發(fā)環(huán)境搭建
本文將介紹如何使用VSCode搭建Go語(yǔ)言開發(fā)環(huán)境,Go語(yǔ)言是一種簡(jiǎn)潔高效的編程語(yǔ)言,而VSCode是一款輕量級(jí)的集成開發(fā)環(huán)境,二者的結(jié)合可以提供良好的開發(fā)體驗(yàn),2023-08-08
go-zero創(chuàng)建RESTful API 服務(wù)的方法
文章介紹了如何使用go-zero框架和goctl工具快速創(chuàng)建RESTfulAPI服務(wù),通過定義.api文件并使用goctl命令,可以自動(dòng)生成項(xiàng)目結(jié)構(gòu)、路由、請(qǐng)求和響應(yīng)模型以及處理邏輯,感興趣的朋友一起看看吧2024-11-11
Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究
這篇文章主要為大家介紹了Golang實(shí)現(xiàn)自己的Redis(有序集合跳表)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Golang實(shí)現(xiàn)JWT身份驗(yàn)證的示例詳解
JWT(JSON Web Token)是一種開放標(biāo)準(zhǔn)(RFC 7519),用于在網(wǎng)絡(luò)應(yīng)用間安全地傳輸聲明,本文主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)JWT身份驗(yàn)證的相關(guān)方法,希望對(duì)大家有所幫助2024-03-03
GoLang?socket網(wǎng)絡(luò)編程傳輸數(shù)據(jù)包時(shí)進(jìn)行長(zhǎng)度校驗(yàn)的方法
在GoLang?socket網(wǎng)絡(luò)編程中,為了確保數(shù)據(jù)交互的穩(wěn)定性和安全性,通常會(huì)通過傳輸數(shù)據(jù)的長(zhǎng)度進(jìn)行校驗(yàn),發(fā)送端首先發(fā)送數(shù)據(jù)長(zhǎng)度,然后發(fā)送數(shù)據(jù)本體,接收端則根據(jù)接收到的數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)本體進(jìn)行比較,以此來確認(rèn)數(shù)據(jù)是否傳輸成功2024-11-11
Windows+Linux系統(tǒng)下Go語(yǔ)言環(huán)境安裝配置過程
Go 語(yǔ)言被設(shè)計(jì)成一門應(yīng)用于搭載 Web 服務(wù)器,存儲(chǔ)集群或類似用途的巨型中央服務(wù)器的系統(tǒng)編程語(yǔ)言。這篇文章主要介紹了Windows+Linux系統(tǒng)下Go語(yǔ)言環(huán)境搭建配置過程,針對(duì)每種系統(tǒng)給大家講解的非常詳細(xì),需要的朋友可以參考下2021-06-06

