在 go 語(yǔ)言中,堆內(nèi)存用于存儲(chǔ)動(dòng)態(tài)分配的對(duì)象,其生命周期更長(zhǎng)。堆內(nèi)存分配使用 new 關(guān)鍵字,而手動(dòng)釋放堆內(nèi)存會(huì)導(dǎo)致內(nèi)存泄漏。為了解決這一問題,可以使用 defer 語(yǔ)句在函數(shù)返回時(shí)自動(dòng)釋放堆內(nèi)存。堆內(nèi)存管理在緩存系統(tǒng)中非常有用,通過使用 map 即可實(shí)現(xiàn)簡(jiǎn)單的鍵值緩存,注意在并發(fā)環(huán)境下管理堆內(nèi)存時(shí)需要使用同步機(jī)制。
Go 語(yǔ)言堆內(nèi)存管理實(shí)戰(zhàn)
在 Go 語(yǔ)言中,堆內(nèi)存用于存儲(chǔ)動(dòng)態(tài)分配的對(duì)象。相對(duì)于棧內(nèi)存,堆內(nèi)存的生命周期更長(zhǎng),可以根據(jù)需要進(jìn)行分配和釋放。
堆內(nèi)存分配
使用 new 關(guān)鍵字可以為堆內(nèi)存分配空間。它接受一個(gè)類型的參數(shù),并返回一個(gè)指向該類型的新分配對(duì)象的指針。
// 分配一個(gè) int 類型堆內(nèi)存 p := new(int) // p 為類型 *int i := *p // 解引用 p 訪問堆內(nèi)存中的值 fmt.Println(i) // 輸出 0
登錄后復(fù)制
堆內(nèi)存釋放
手動(dòng)釋放堆內(nèi)存會(huì)造成內(nèi)存泄漏,因?yàn)?Go 語(yǔ)言沒有內(nèi)置的垃圾回收機(jī)制。相反,可以使用 defer 語(yǔ)句在函數(shù)返回時(shí)自動(dòng)釋放堆內(nèi)存。
// 使用 defer 自動(dòng)釋放堆內(nèi)存
func main() {
p := new(int)
defer func() {
fmt.Println("釋放堆內(nèi)存")
*p = 0 // 釋放前應(yīng)將值置為零
p = nil // 設(shè)置 p 為 nil
}()
// 使用堆內(nèi)存
*p = 10
fmt.Println(*p)
}
登錄后復(fù)制
實(shí)戰(zhàn)案例:緩存
堆內(nèi)存管理在緩存系統(tǒng)中非常有用。緩存將經(jīng)常訪問的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,以提高訪問速度。
// 使用 map 實(shí)現(xiàn)簡(jiǎn)單的鍵值緩存
type Cache struct {
data map[string]interface{}
}
func NewCache() *Cache {
return &Cache{
data: make(map[string]interface{}),
}
}
func (c *Cache) Get(key string) (interface{}, bool) {
val, ok := c.data[key]
return val, ok
}
func (c *Cache) Set(key string, value interface{}) {
c.data[key] = value
}
登錄后復(fù)制
注意:并發(fā)安全
在并發(fā)環(huán)境中管理堆內(nèi)存需要使用同步機(jī)制,如互斥量或讀寫鎖,以防止并發(fā)訪問導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)。






