成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 將會支持弱指針 weak!你知道嗎?

開發 前端
后續弱指針的引用,可以給 Go 的使用打開一個新的 “后門”。隨著這個趨勢的不斷形成,個人覺得以后 Go 也能有一派開發者針對自己的高性能要求的代碼場景玩出一波騷操作了。

大家好,我是煎魚。

最近 Go 又有了新的動作,一路綠燈,已經審批通過了新增弱指針(weak pointers)庫的提案,這對于 Go 來講是一個不錯的補充。

今天這篇文章我們主要分享弱指針的介紹,讓大家有一個基本前瞻。因為這個提案已經 Accepted!

圖片

弱指針是什么

此處是引用 Go 官方提案給出的介紹和原因,也就是為什么 Go 核心團隊認可要去做弱指針。

弱指針(或其他語言中的弱引用)允許開發人員引用內存,而不妨礙垃圾回收器回收內存。為防止出現可見的懸掛引用,弱指針在引用的內存被回收時會變為零。

弱指針可以轉換為常規(“強”)指針,這樣就能防止垃圾回收器回收內存,并允許對內存進行典型使用和訪問。

圖片

弱指針通常比普通指針更難處理,因為它們隨時都可能變為零。幾乎每一次弱指針到強指針的轉換都必須進行 nil 檢查。通常,弱指針會在意想不到的時候變為零。

盡管如此,弱指針仍然存在于許多語言中,因為它們非常有用。弱指針的主要使用場景與高效內存管理和回收有關。

可能的場景包含但不限于:

  • 為規范化映射有效管理內存,或為生命周期與另一個對象的生命周期綁定的內存(類似于 JavaScript 的 WeakMap)有效管理內存。
  • 弱指針的另一個良好用例是向 GC 提示:可以放棄某些資源,因為以后重建這些資源的成本很低,尤其是在這些資源占用大量內存的情況下。

弱指針 API 設計

Go 官方計劃新增一個 weak 包,添加以下 API 作為弱指針的使用:

type Pointer[T any] struct { ... }

func Make[T any](ptr *T "T any") Pointer[T] { ... }

func (p Pointer[T]) Value() *T { ... }

這些 API 主要用于創建和管理弱指針。Pointer[T] 是一個弱指針類型,能夠引用類型為 T 的值,但不會阻止該值被垃圾回收。

使用 Make 函數可以從一個有效的指針中創建一個弱指針,而 Value 方法則返回原始指針,若值已被回收則返回 nil。

弱指針的比較遵循特定規則,例如:同一對象的不同字段創建的弱指針不相等,且如果對象通過 runtime.SetFinalizer 復活,之前的弱指針也會失效。

這樣的設計目的是為了有效管理內存并避免內存泄漏。

使用例子

前 Go 核心團隊負責人 rsc 在接納這個提案時,設計了一個弱緩存抽象的例子。

代碼如下:

type Cache[K any, V any] struct {
    f func(*K) V
    m atomic.Map[weak.Pointer[K], func() V]
}

func NewCache[K comparable, V any](f func(*K "K comparable, V any")V) *Cache[K, V] {
    return &Cache[K, V]{f: f}
}

func (c *Cache[K, V]) Get(k *K) V {
    kw := weak.Make(k)
    vf, ok := c.m.Load(kw)
    if ok {
        return vf()
    }
    vf = sync.OnceValue(func() V { return c.f(k) })
    vf, loaded := c.m.LoadOrStore(kw)
    if !loaded {
        // Stored kw→vf to c.m; add the cleanup.
        runtime.AddCleanup(k, c.cleanup, kw)
    }
    return vf()
}

func (c *Cache[K, V]) cleanup(kw weak.Pointer[K]) {
    c.m.Delete(kw)
}

var cached = NewCache(expensiveComputation)

部分社區爭議

爭議主要集中在以下幾個方面:

  1. 必要性:部分開發者質疑弱指針是否解決了實際問題,是否足夠常用。
  2. 復雜性:有人擔心引入弱指針會增加代碼復雜性,尤其對新手開發者。
  3. 性能開銷:討論弱指針可能帶來的性能影響,是否值得引入。
  4. 兼容性:考慮弱指針與現有內存管理機制的兼容性。
  5. 接口設計:對弱指針的具體實現和接口設計存在不同意見。

總的來講,圍繞著弱指針的實際需求、使用復雜性及其對性能的影響。還有如何設計其接口等問題展開。

注:問題都是問題。rsc 已經以一己之力把這個提案往 Accepted 推了。

總結

后續弱指針的引用,可以給 Go 的使用打開一個新的 “后門”。隨著這個趨勢的不斷形成,個人覺得以后 Go 也能有一派開發者針對自己的高性能要求的代碼場景玩出一波騷操作了。

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2025-05-22 09:32:23

2021-11-10 15:37:49

Go源碼指令

2025-01-20 00:00:00

Java語言Record

2024-09-02 00:30:41

Go語言場景

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量

2022-01-05 11:40:36

Go特性語言

2021-05-31 10:22:09

Go語言代碼

2021-10-08 21:00:52

數據弱引用對象

2023-12-20 08:23:53

NIO組件非阻塞

2023-12-12 08:41:01

2023-04-26 10:21:04

2024-04-30 09:02:48

2020-02-20 08:30:49

OSPF網絡協議路由協議

2021-04-20 23:16:06

SparkSQL語法

2022-12-02 14:12:52

新能源汽車海爾

2024-07-08 00:00:01

多線程ThreadC#

2025-02-18 08:11:17

2024-09-18 07:00:00

消息隊列中間件消息隊列

2022-11-04 14:16:05

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人精品二区三区99精品 | 国产久视频 | 中文精品视频 | 国产精品欧美一区二区三区不卡 | 91.xxx.高清在线 | 国产精品不卡 | 99福利视频 | 久久久久久久久99精品 | 青青久草 | 欧美一区二区三区视频在线观看 | 成人av网站在线观看 | 欧美成人精品在线 | 日韩天堂av | 中文字幕在线播放第一页 | 久久精品在线 | 99成人免费视频 | 国产精品久久久久久久久免费樱桃 | 国产激情一区二区三区 | 亚洲毛片在线观看 | 视频第一区 | 看av电影| 在线播放国产一区二区三区 | 日本小电影在线 | 欧美天堂| 久久影院一区 | 91精品国产一区二区三区 | 91在线电影 | 成人在线视频网站 | 日本福利在线 | 国产成人精品午夜 | 99精品欧美一区二区蜜桃免费 | 国产av毛片 | 天天舔天天 | 综合九九| 久久久久www | 国产xxxx在线 | 久久久久久美女 | 日韩一区二区三区在线播放 | 亚洲精品1区 | 精品视频免费 | 在线精品观看 |