Go1.20最新資訊go?arena手動(dòng)管理內(nèi)存鴿了
導(dǎo)讀
年初有給大家分享 Go1.20 arena 能手動(dòng)管理內(nèi)存的事情,當(dāng)時(shí)不論是我們讀者,還是社區(qū)上的小伙伴們,都是比較激動(dòng)的。畢竟這是一個(gè)有意思的特性。
這不,今年都快過(guò)去了。2024 年要來(lái)了。有小伙伴問(wèn)這個(gè)最新的進(jìn)展:
今天這篇文章就是給大家同步目前的情況。第一節(jié)是前置知識(shí),如果不太記得背景的同學(xué)可以快速看一下。
前置知識(shí)
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ì),基于 Google 自身的需求,快速通過(guò)了實(shí)踐。在 Go1.20 支持使用環(huán)境變量啟用:
GOEXPERIMENT=arenas go run main.go
預(yù)計(jì)至少會(huì)提供以下 API:
- NewArena:創(chuàng)建一個(gè)新的 arena 內(nèi)存空間。
- Free:釋放 arena 及其關(guān)聯(lián)對(duì)象。
- New:基于 arena,創(chuàng)建新對(duì)象。NewSlice 等屬于其派生方法,結(jié)果是一樣的。
- MakeSlice:基于 arena,創(chuàng)建新切片。
- Clone:克隆一個(gè) arena 的對(duì)象,并移動(dòng)到內(nèi)存堆上。
對(duì)應(yīng)的示例代碼如下:
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)存,就可以做很多事了,當(dāng)然,也 “容易” 崩。
最新進(jìn)展
其實(shí)這個(gè) arena 提案當(dāng)時(shí)已經(jīng)快速的進(jìn)入了實(shí)驗(yàn)階段,大家以為能很快就能正式發(fā)布了。(畢竟來(lái)自 Google 內(nèi)部的需求)
但這個(gè)特性引發(fā)了非常多的討論,應(yīng)該有超過(guò) 1k+ 條評(píng)論。
當(dāng)前 arena 提案的狀態(tài)為:自 2023 年 1 月 17 日起,由于嚴(yán)重的 API 問(wèn)題,該提案被無(wú)限期擱置,GOEXPERIMENT=arena 代碼可能會(huì)隨時(shí)發(fā)生不兼容的更改或刪除,我們不建議在生產(chǎn)中使用它。
由于過(guò)于繁雜,Go 核心團(tuán)隊(duì)成員@Ian Lance Taylor,也表態(tài):目前尚未做出任何決定,也不可能在短期內(nèi)做出任何決定。
可以認(rèn)為這個(gè)提案基本鴿了,因?yàn)橐呀?jīng)快一年了,也沒(méi)有新的破局思路。
爭(zhēng)議點(diǎn)
原本如此高歌猛進(jìn)的 arena 提案,是在哪卡殼阻塞了?從我猛翻 1k 樓層來(lái)看,以及官方給出的原因來(lái)看。
主要還是有一位同學(xué)提出:擔(dān)心重走上下文(context)的老路!
目前 context 大量的滲透了 Go 所有庫(kù)的 API,雖然很難評(píng)定好與不好。但是純粹從語(yǔ)言設(shè)計(jì)的角度來(lái)看,上下文并不漂亮。
甚至我經(jīng)常遇到同學(xué)來(lái)吐槽,咱們這個(gè) ctx 放在函數(shù)第一個(gè)參數(shù),或是放結(jié)構(gòu)體里。到底是誰(shuí)的設(shè)計(jì)。能不能像 Java 語(yǔ)言一樣來(lái)個(gè)注解。
但 arena 不一樣,一旦和 context 一樣泛濫,將會(huì)帶來(lái)更大的影響。你永遠(yuǎn)不知道你正在使用的第三方庫(kù),是否使用了手動(dòng)管理內(nèi)存 arena,是否會(huì)導(dǎo)致各種奇怪的問(wèn)題。(除非你去翻代碼和依賴(lài))
因此 arena 庫(kù)的出現(xiàn),將會(huì)導(dǎo)致在創(chuàng)建對(duì)象時(shí)進(jìn)行的一系列分配行為,將沒(méi)有明確的界限,完全取決于應(yīng)用他的庫(kù)如何使用。同時(shí)在內(nèi)部處理 arena 和非 arena 情況的實(shí)現(xiàn)代碼,將使得 API 將變得更加污染。
最終大家還是希望 arena 能夠在一定的界限范圍內(nèi)明確使用。但這一切均懸而未決。以上是我個(gè)人結(jié)合討論所理解的提案阻塞緣由。
總結(jié)
Arena,這是一個(gè)非常受大家關(guān)注的特性,因?yàn)樗梢栽?Go 語(yǔ)言中做到手動(dòng)管理內(nèi)存,做更多的一些騷操作。以后就不用另辟蹊徑走 CGO 了。
但潘多拉魔盒一旦打開(kāi),還是有潛在風(fēng)險(xiǎn)的。因此 arena 庫(kù)很大概率會(huì)在找到更安全的 API 設(shè)計(jì)后,才會(huì)正式轉(zhuǎn)為正式庫(kù)對(duì)外公開(kāi)。
當(dāng)然,如果你想自己內(nèi)部使用,且已經(jīng)知悉風(fēng)險(xiǎn)。也可以直接在 Go1.20 使用 GOEXPERIMENT=arenas
也能夠使用該實(shí)驗(yàn)特性。
以上就是Go1.20最新資訊go arena手動(dòng)管理內(nèi)存鴿了的詳細(xì)內(nèi)容,更多關(guān)于Go arena內(nèi)存管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù)詳解
這篇文章主要介紹了Go語(yǔ)言如何實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Go中Goroutines輕量級(jí)并發(fā)的特性及效率探究
這篇文章主要為大家介紹了Go中Goroutines輕量級(jí)并發(fā)的特性及效率探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12手把手帶你走進(jìn)Go語(yǔ)言之運(yùn)算符解析
這篇文章主要介紹了手Go語(yǔ)言之運(yùn)算符解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09一文帶你熟悉Go語(yǔ)言中的分支結(jié)構(gòu)
這篇文章主要和大家分享一下Go語(yǔ)言中的分支結(jié)構(gòu)(if?-?else-if?-?else、switch),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下2022-11-11