Go1.20?arena新特性示例詳解
正文
大概半年前,我寫(xiě)過(guò)一篇文章《Go 要違背初心嗎?新提案:手動(dòng)管理內(nèi)存》。有興趣了深入解的同學(xué),可以再回顧一下。
當(dāng)時(shí)我們還想著 Go 團(tuán)隊(duì)?wèi)?yīng)該不會(huì)接納,至少不會(huì)那么快:

懶得翻也可以看我再次道來(lái),本文提到的提案《proposal: arena: new package providing memory arenas》,這其中的 Arena 將會(huì)是一個(gè)突破項(xiàng)。
快速背景
Arena 指的是一種從一個(gè)連續(xù)的內(nèi)存區(qū)域分配一組內(nèi)存對(duì)象的方式。優(yōu)點(diǎn)比一般的內(nèi)存分配更有效率,也可以一次性釋放。當(dāng)然了,它的重點(diǎn)是要手動(dòng)管理內(nèi)存。
Go 團(tuán)隊(duì)希望加進(jìn) Go 特性中,示例代碼如下:
import (
“arena”
…
)
type T struct {
val int
}
func main() {
a := arena.New()
var ptrT *T
a.New(&ptrT)
ptrT.val = 1
var sliceT []T
a.NewSlice(&sliceT, 100)
sliceT[99].val = 4
a.Free()
}
手動(dòng)調(diào)用 arena.New 方法分配 arena 內(nèi)存,再調(diào)用 Free 方法進(jìn)行釋放。
簡(jiǎn)單來(lái)講就是可以手動(dòng)管理內(nèi)存,就可以做很多事了,也 “容易” 崩。
最新進(jìn)展
這個(gè)提案一直在 issues 上適度的爭(zhēng)議討論,@Michael Knyszek 大佬代碼寫(xiě)的很快,已經(jīng)直接提交上去了...直到最近被人發(fā)現(xiàn),讓他更新進(jìn)度。

已經(jīng)明確:Go1.20 將會(huì)支持 arena 特性,通過(guò) GOEXPERIMENT=arena 來(lái)打開(kāi),接受大家的 review 和使用,抗阻很小。
已實(shí)現(xiàn) API 和原提案不同的地方有:
- API 使用了泛型,例如:
arena.New[int](myArena "int")。 - Arena 的 塊大小是 8 MiB 而不是 64 MiB,似乎在更多情況下提供了更好的性能。
- MSAN 和 ASAN 模式可用于識(shí)別不會(huì)導(dǎo)致崩潰的 use-after-free 錯(cuò)誤(內(nèi)存損壞應(yīng)該仍然是不可能的)。 需注意,這些模式對(duì)非 cgo 的 Go 程序幾乎沒(méi)有作用。Arena 是個(gè)例外。
另外根據(jù)社區(qū)的反饋,可能還會(huì)出現(xiàn)配套類(lèi)型的 Arena。如下函數(shù)簽名:
// MakeMap creates a new map[K]V with the provided capacity.
// The map[K]V must not be used after the arena is freed.
// Accessing the underlying storage of the map after free may result in a fault,
// but this fault is also not guaranteed.
func MakeMap[K comparable, V any](a *Arena, cap int "K comparable, V any") map[K]V { ... }
在 Go1.20 發(fā)布該新特性的話,按照發(fā)布周期計(jì)劃,是 2 月份左右發(fā)布,相信大家很快就能用上,可以多多關(guān)注。
總結(jié)
一開(kāi)始了解這個(gè)提案時(shí),還想著 Go 搞了快 10 年才采納和推進(jìn)泛型。這 Arena 應(yīng)該不至于這么快吧?畢竟加進(jìn)去了,許多程序都可以寫(xiě)的復(fù)雜起來(lái)。
沒(méi)想到...現(xiàn)實(shí)打臉來(lái)的太快,推進(jìn)的很快。
就像其他小伙伴說(shuō)的,這可以從代碼優(yōu)化性能,而不需要砍需求。也是一個(gè)有意思且不錯(cuò)的源動(dòng)力!
據(jù)小道消息,某些同學(xué)表示在框架和其它場(chǎng)景測(cè)過(guò),有說(shuō)變得快了,有說(shuō)沒(méi)差多少。比較迷,提案內(nèi)暫時(shí)未提供測(cè)試報(bào)告,不好定論。
Go 1.20 Beta 將在未來(lái)幾周內(nèi)(2022.11 月底前)發(fā)布,讓我們拭目以待:)
以上就是Go1.20 arena新特性示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go1.20 arena新特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型
這篇文章主要介紹了Go泛型實(shí)戰(zhàn)教程之如何在結(jié)構(gòu)體中使用泛型,根據(jù)Go泛型使用的三步曲提到的:類(lèi)型參數(shù)化、定義類(lèi)型約束、類(lèi)型實(shí)例化我們一步步來(lái)定義我們的緩存結(jié)構(gòu)體,需要的朋友可以參考下2022-07-07
Golang連接并操作PostgreSQL數(shù)據(jù)庫(kù)基本操作
PostgreSQL是常見(jiàn)的免費(fèi)的大型關(guān)系型數(shù)據(jù)庫(kù),具有豐富的數(shù)據(jù)類(lèi)型,也是軟件項(xiàng)目常用的數(shù)據(jù)庫(kù)之一,下面這篇文章主要給大家介紹了關(guān)于Golang連接并操作PostgreSQL數(shù)據(jù)庫(kù)基本操作的相關(guān)資料,需要的朋友可以參考下2022-09-09
淺談Golang 嵌套 interface 的賦值問(wèn)題
這篇文章主要介紹了淺談Golang 嵌套 interface 的賦值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
go build -tags構(gòu)建約束試驗(yàn)示例解析
這篇文章主要為大家介紹了go build -tags構(gòu)建約束試驗(yàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用
時(shí)間和日期是我們編程中經(jīng)常會(huì)用到的,本文主要介紹了golang標(biāo)準(zhǔn)庫(kù)time時(shí)間包的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

