گولنگ 1.24: ماژول جدید به نام `weak`

! برای مدیریت بهتر ابجکت ها از weak.Pointer استفاده کنید !


پکیج Weak چیه؟

گولنگ در نسخه جدید یعنی 1.24 یک استاندارد لایبرری (std-lib) جدید معرفی کرد. این پکیج "weak" نام داره و به شما اجازه میده که یک رفرنس امن بسازید برای *T بدون دخالت garbage collector (GC).

The weak package provides ways to safely reference memory weakly, meaning without preventing its reclamation by the garbage collector.

مثل خیلی از زبان های دیگه قابلیت weak در دیگر زبان ها وجود داره:

در جاوا: WeakReference و SoftReference.

در پایتون: ماژول weakref.

در C++: ماژول std::weak_ptr.

در Rust: استفاده از Weak.

در پی اچ پی: کلاس WeakReference.


ساختار Weak

پکیج weak دو متد به نام "()Make" و "()Value" داره:

با استفاده از weak.Make یک weak.Pointer برای شما ساخته میشه و اگه *T اصلی GC نداشته باشه میتونیم به آدرسش دسترسی داشته باشیم با استفاده از weak.Pointer.Value. اگه آبجکت جمع آوری (collected) شده بود مقدار برگشتی ما nil خواهد بود.

یک مثال از اون رو ببینیم:

package main

import (
    "fmt"
    "runtime"
    "strings"
    "time"
    "unsafe"
    "weak"
)

func main() {
    originalObject := "Hello, World!"
    runtime.AddCleanup(&originalObject, func(s int64) {
       fmt.Println("originalObject clean at: ", s)
    }, time.Now().Unix())
    weakPtr := weak.Make(&originalObject)
    fmt.Println(fmt.Sprintf("originalObject:addr %x", &originalObject))
    fmt.Println(fmt.Sprintf("weakPtr addr:%x,size:%d", weakPtr, unsafe.Sizeof(weakPtr)))
    runtime.GC()
    time.Sleep(1 * time.Millisecond)
    value := weakPtr.Value()
    if value != nil && strings.Contains(*value, originalObject) {
       fmt.Println("First GC :value: ", *value)
    } else {
       fmt.Println("first gc. Weak reference value is nil")
    }
    runtime.GC()
    time.Sleep(1 * time.Millisecond)
    value = weakPtr.Value()
    if value != nil {
       fmt.Println("Second GC", *value)
    } else {
       fmt.Println("Second GC: Weak reference value is nil")
    }
}

مقدار خروجی که برای ما برمیگردونه:

➜  weak git:(main) ✗ gotip version
go version devel go1.24-18b5435 Sun Dec 15 21:41:28 2024 -0800 darwin/arm64
➜  weak git:(main) ✗ gotip run main.go
originalObject:addr 14000010050
weakPtr addr:{1400000e0d0},size:8
First GC :value:  Hello, World!
originalObject clean at:  1734340907
Second GC: Weak reference value is nil

خب حالا ما چیکار کردیم؟

  • ما یک متغیر از نوع رشته با نام originalObject ساختیم و از weak.Make استفاده کردیم برای ساخت weak.Pointer.
  • در اولین GC از originalObject استفاده میشه، همینطور weakPtr.Value مقدار آدرس originalObject برمیگردونه.
  • در مرحله دوم GC دیگه از originalObject استفاده نمیشه و مقدار weakPtr.Value برابر با nil میشه.

همینطور یک قابلیت جدید گولنگ 1.24 runtime.AddCleanup هست. این runtime.AddCleanup بسیار بشبیه به runtime.SetFinalizer هست که میتونیم از آبجکت ها استفاده کنیم زمانی که GC هستند. 


صفحه رسمی پکیج weak

0 🔥
0 🎉
0 😮
1 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁