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

! برای مدیریت بهتر ابجکت ها از 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 هستند.
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁