Forwarded from DevTwitter | توییت برنامه نویسی
چطوری به متدهای Policy توی لاراول متغیر ارسال کنیم؟
داخل متد authorize کلاس Gate بعد از اینکه اسم متد متناظر توی policy رو پاس دادیم در قالب یک آرایه، اول مدلمون رو پاس میدیم و بعد متغیری که مدنظرمون هست. اینجوری میتونیم اون متغیر رو داخل متد policy داشته باشیم. مثال:
توی عکس های زیر، من میخوام آرایه ای از آیدی های کاربران رو بگیرم و همشون رو حذف کنم، اما میخوام در صورتی که آیدی شماره ۱ بین آیدی های انتخاب شده باشه، اجازه حذف داده نشه و خطای ۴۰۳ برگردونه. پس آرایه آیدی هارو پاس میدم به policy و اونجا چک میکنم، اگر آیدی ۱ داخل آرایه نبود، true برگردونه و اجازه عملیات رو صادر کنه.
عکس اول داخل کنترلر جایی که از Gate پالیسی رو فرا میخونیم. و عکس دوم داخل UserPolicy هست. (نحوه فراخونی policy توی لاراول ۱۱ کمی عوض شده)
@DevTwitter | <Pouya Farshidnia/>
داخل متد authorize کلاس Gate بعد از اینکه اسم متد متناظر توی policy رو پاس دادیم در قالب یک آرایه، اول مدلمون رو پاس میدیم و بعد متغیری که مدنظرمون هست. اینجوری میتونیم اون متغیر رو داخل متد policy داشته باشیم. مثال:
توی عکس های زیر، من میخوام آرایه ای از آیدی های کاربران رو بگیرم و همشون رو حذف کنم، اما میخوام در صورتی که آیدی شماره ۱ بین آیدی های انتخاب شده باشه، اجازه حذف داده نشه و خطای ۴۰۳ برگردونه. پس آرایه آیدی هارو پاس میدم به policy و اونجا چک میکنم، اگر آیدی ۱ داخل آرایه نبود، true برگردونه و اجازه عملیات رو صادر کنه.
عکس اول داخل کنترلر جایی که از Gate پالیسی رو فرا میخونیم. و عکس دوم داخل UserPolicy هست. (نحوه فراخونی policy توی لاراول ۱۱ کمی عوض شده)
@DevTwitter | <Pouya Farshidnia/>
مثلاً فرض کن یه کدی داریم که باید یه تابع به اسم ()work رو اجرا کنه. این تابع قراره 100 میلیثانیه طول بکشه. حالا دو تا سناریو داریم:
اینجا Deadline رو 150 میلیثانیه تعیین میکنیم، یعنی کد ما زمان کافی داره.
func main() {
deadline := time.Now().Add(150 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
res, err := execute(ctx, work)
fmt.Println(res, err) // نتیجه درست برمیگرده
}
کد بدون مشکل اجرا میشه چون زمان کافی داشتیم.
حالا Deadline رو 50 میلیثانیه میذاریم، اما ()work حداقل 100 میلیثانیه نیاز داره.
func main() {
deadline := time.Now().Add(50 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
res, err := execute(ctx, work)
fmt.Println(res, err) // نتیجه لغو میشه
}
عملیات لغو میشه (
context.Canceled
) چون مهلت کافی وجود نداشت. ithTimeout
و WithDeadline
چیه؟بله WithTimeout یه مقدار زمان مشخص میگیره (مثلاً 5 ثانیه)، اماWithDeadline دقیقاً یه زمان مشخص (مثلاً 23:00:05).
جالبیش اینه که WithTimeout خودش از WithDeadline استفاده میکنه:
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}
با متد Deadline، میتونیم زمان مشخص شده رو ببینیم.
اگه کانتکست با WithTimeout یا WithDeadline شده باشه، یه زمان مشخص میده.
اما اگه با WithCancel یا Background ساخته شده باشه، میگه نه!
ctx, _ := context.WithCancel(context.Background())
deadline, ok := ctx.Deadline()
fmt.Println(deadline, ok) // نتیجه: false
ctx = context.Background()
deadline, ok = ctx.Deadline()
fmt.Println(deadline, ok) // باز هم false
#گو #گولنگ #Go #Golang
Please open Telegram to view this post
VIEW IN TELEGRAM
اگه شما هم با Golang کد میزنید، خبر خوب اینه که ورژن 1.24 قراره تو فوریه 2025 منتشر بشه و کلی بهبود خفن آورده که کارمون رو هم سریعتر میکنه، هم راحتتر.
گولنگ با این تغییر، مدیریت مپها رو خیلی بهینهتر کرده! رم کمتر مصرف میشه و عملیات خوندن/نوشتن سریعتر شده.
دو پکیج جدید داریم:
اولی os.Root برای راحتتر کردن کارهای مربوط به دایرکتوریها.
دومی weak برای هندل کردن weak pointers که خیلی وقتا به درد میخوره.
یه قابلیت جدید برای alias کردن sliceها که به خصوص با افزایش استفاده از جنریکها خیلی کاربردیه.
یه قابلیت خفن به اسم متا-پترن اضافه شده که نصب ابزارهایی مثل mockgen رو راحتتر از همیشه میکنه.
خروجی JSON برای go test: تحلیل تستها دیگه یه لذت شده!
و GOAUTH: حالا میتونید راحتتر به ریپوزیتوریهای پرایوت مثل GitHub وصل بشید.
این نسخه شاید تغییرات انقلابی نداشته باشه، ولی پر از آپدیتهای کاربردی که واقعاً حس میکنید کارتون سریعتر و تمیزتر شده. تغییراتی مثل سوئیچ به SwissTable و GOAUTH کار رو برای تیمهایی که با پروژههای بزرگ و پرایوت کار میکنن، بسیار سادهتر کرده.
#گولنگ #گولنگ_1_24
#GoLang #Go1_24 #DeveloperExperience #Tooling
Please open Telegram to view this post
VIEW IN TELEGRAM
فرض کن جلوی یه ساختمون خیلی شیک و بزرگ وایسادی، ولی لازم نیست بری داخلش و همه اتاقاشو ببینی. فقط کافیه از بیرون، نمای ساده و مرتبش رو ببینی و کارتو راه بندازی. پترن Facade دقیقاً همینه! یه رابط کاربری ساده میده که دیگه لازم نباشه با پیچیدگیهای سیستم درگیر بشی.
دو تا اصل مهم دنیای کدنویسی اینجا برامون روشنتر میشه:
وقتی از Facade استفاده میکنی، پیچیدگیهای پشت پرده سیستم رو قایم میکنی و فقط چیزی که کاربر (یا حتی خودت!) نیاز داری رو نشون میدی. کدت مرتبتر، قابل نگهداریتر و قابلفهمتر میشه.
فرض کن میخوای به دیتابیس وصل بشی، کوئری بزنی و قطع کنی. بدون Facade اینجوریه:
type Database struct {
DatabaseConnection *sql.DB
}
func (db *Database) Connect() {
// کد اتصال
}
func (db *Database) Query() {
// کد کوئری
}
func (db *Database) Disconnect() {
// قطع اتصال
}
// استفاده
var db Database
db.Connect()
db.Query()
db.Disconnect()
ولی با Facade، همه اینا تو یه دونه تابع جمع میشه:
type DatabaseFacade struct {
Database *Database
}
func (dbf *DatabaseFacade) ExecuteQuery() {
dbf.Database.Connect()
dbf.Database.Query()
dbf.Database.Disconnect()
}
// استفاده
var dbf DatabaseFacade
dbf.ExecuteQuery()
کار با فایلها
ارتباط با API
راهاندازی وبسرور
مدیریت سفارشهای فروشگاه آنلاین
دیزاین پترن Facade، یه ابزار فوقالعاده برای سادهسازی و مرتب کردن کدهاتونه. اما همونطور که هر چیزی حد داره، از این پترن هم فقط وقتی استفاده کن که به درد بخوره و لازم باشه.
شما چطور از Facade استفاده کردید تجربههاتون رو تو کامنتها بگید.
#الگوی_طراحی #Facade #گو #گولنگ #Go #Golang #KISS #DRY
Please open Telegram to view this post
VIEW IN TELEGRAM
خیلیها این روزها دوباره دارن از سرورلس به سمت سرورهای اختصاصی و VPS برمیگردن. چند سال پیش همه دنبال سرورلس بودن، ولی الان؟ دیگه اوضاع فرق کرده! توی این پست میخوام چند تا از دلایلی که سرورلس یه انتخاب ضعیفه رو به زبون ساده باهاتون به اشتراک بذارم.
شرکتهای بزرگی مثل AWS و Azure دقیقاً میدونن چطوری شما رو قفل سیستم خودشون کنن. وقتی واردش میشید، بیرون اومدن ازش هزینههای وحشتناک داره:
نتیجه؟ یه قبض ماهانه که هیچی ازش نمیفهمید ولی قطعاً خوشحالتون نمیکنه.
بهقول یکی از مدیران بزرگ، اومدن روی VPS میتونه هزاران دلار صرفهجویی کنه. تازه، وقتی خودت سیستم رو مدیریت میکنی، دستت بازتره و همهچی رو کنترل میکنی.
سرورلس بهشدت پیچیدهست. مثال ساده؟ یه کانفیگ اشتباه میتونه میلیاردها تومان خسارت بزنه!
بودند کسایی که بهخاطر فراموش کردن تنظیمات S3، هزینههای سنگینی دادن!
توی VPS، همهچی رو میتونی ساده و شفاف مدیریت کنی. مثلاً یه آموزش ساده برای قفل کردن سرور با Fail2Ban و غیرفعال کردن رمز ورود برای کاربر Root میتونه امنیت رو بهشدت بالا ببره.
وقتی سیستم سادهتر باشه، کمتر قطع میشه. از وقتی از سرورلس به VPS مهاجرت کردم، سرویسهام هیچوقت خودبهخود قطع نشدن. ولی سرورلس؟
آپتایم ادعایی این شرکتها معمولاً روی کاغذه. ولی واقعیت؟ یه اشتباه کوچیک، یه کلیک اشتباه و تمام اون ۹۹.۹۹٪ میپره.
با سرورلس، هر سرویس جداگانه باید کانفیگ بشه. برای هر میکروسرویس باید دستی کانفیگ امنیتی انجام بدی. این یعنی کار چند برابر.
ولی روی VPS؟ یه سرور، یه کانفیگ، تمومه!
بعضیها میگن سرورلس بهتون محافظت رایگان DDoS میده. اما یه نکتهی جالب:
شما همون محافظت رو میتونید با Cloudflare بهصورت رایگان بگیرید. کافیه پروکسی Cloudflare رو فعال کنید و SSL/TLS رو روی حالت Full بذارید. همون یه کلیک، همون امنیت. نیازی به سرورلس نیست.
#سرورلس #میکروسرویس #serverless #vps
Please open Telegram to view this post
VIEW IN TELEGRAM
func send(ch chan<- int) {
defer close(ch)
fmt.Println("Sending 1...")
ch <- 1 // Blocks until the receiver is ready
for i := 0; i < 10; i++ {
fmt.Printf("Sending %d...\n", i)
ch <- i // Blocks until the receiver reads the value
}
}
func main() {
ch := make(chan int) // Unbuffered channel
go send(ch)
for val := range ch {
fmt.Printf("Received %d\n", val)
}
}
این رفتار به دلیل ماهیت همزمانی goroutineها است:
در فانکشن send، خط fmt.Println("Sending 0...") قبل از بلوکه شدن ch <- i اجرا میشه. یعنی حتی اگه فرستادن داده منتظر گیرنده بمونه، متن چاپ میشه.
گیرنده در حلقه for در حال دریافت و چاپ داده است. اما عملیات ارسال و دریافت روی دو goroutine مختلف اجرا میشن. این یعنی ترتیب چاپها کاملاً قابل پیشبینی نیست.
گولنگ زمانبندی goroutineها رو خودش مدیریت میکنه. به همین دلیل ممکنه چاپ متن ارسال قبل از دریافت داده تموم بشه.
#گو #گولنگ #Go #Golang
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
آنوفل دوباره باز نویسی شد و تغییرات بزرگی در UI و برندینگ داشته است، از بروزترین و آخرین تکنولوژی های حال حاضر استفاده شده.
Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel
آنوفل | جایی که برنامه نویسان مسیر می سازن
آنوفل یک اکوسیستم برای برنامهنویسان است؛ جایی برای آنهایی که بهجای مصرف، خلق میکنند. اگر میخواهی ابزار بسازی، متفاوت باشی و مسیر خودت را در دنیای کدنویسی بسازی، آنوفل کنار توست.
داکر کامپوز docker compose چیست؟ بررسی تخصصی
💠 داکر (Docker) به شما کمک می کند تا به سرعت یک محیط توسعه را روی دستگاه خود راه اندازی کنید. تنها چند دقیقه طول می کشد تا کل فرآیند را طی کنید. اما بیایید فرض کنیم برای اجرای پروژه شما به حداقل 10 سرویس مختلف در حالت در حال اجرا نیاز دارد. برای مثال، فرض کنید پروژه شما به PHP، Node 23، MySQL، MongoDB، Go، RabbitMQ و غیره نیاز دارد.
🔗 داکر کامپوز docker compose چیست؟ بررسی تخصصی
#docker #داکر #docker_compose
#docker #داکر #docker_compose
Please open Telegram to view this post
VIEW IN TELEGRAM
#گو #گولنگ #کد_تمیز #کد_نویسی
#go #golang #clean_code #Software_Development
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Controlling Deadlines in Go: How to Timeout Your Code with Context
Welcome to Anophel! In this Go programming tutorial, learn how to control function execution time using Go’s powerful context package with deadlines. We’ll walk through two practical scenarios: one where a function completes on time and another where it gets…
#داکر #شبکه #docker
Please open Telegram to view this post
VIEW IN TELEGRAM
---
اهداف اصلی سناریوی آپدیت
حفظ پایداری سیستم
جلوگیری از از دست رفتن دادهها
کاهش حداکثری زمان داونتایم
امکان بازگشت (Rollback) سریع در صورت بروز خطا
---
۱. شناسایی نسخه فعلی و نسخه مقصد
ابتدا نسخهی نصب شده روی سیستم و نسخهی هدف آپدیت را مشخص کنید. این مقایسه مبنای تصمیمگیری برای سایر مراحل خواهد بود.
۲. تهیه نسخه پشتیبان (Backup)
از تمام دادههای حساس مانند:
دیتابیسها
فایلهای کانفیگ
فایلهای آپلود شده توسط کاربر
نسخهی پشتیبان تهیه کنید و مطمئن شوید بازیابی آن تست شده باشد.
۳. بررسی پیشنیازها و ناسازگاریها
قبل از هر تغییری، سازگاری نسخهی جدید با سیستم عامل، معماری سختافزار، نسخههای کتابخانههای جانبی و دیتابیس بررسی شود.
۴. آمادهسازی محیط آپدیت
خالی بودن فضای ذخیرهسازی کافی
اطمینان از دسترسی به اینترنت یا منابع داخلی برای دریافت فایلهای بهروزرسانی
داشتن دسترسیهای لازم (مانند دسترسی root یا admin)
۵. دریافت و اعتبارسنجی فایلهای بهروزرسانی
فایلهای بهروزرسانی باید:
به صورت امن دانلود شوند.
از طریق Checksum یا امضای دیجیتال اعتبارسنجی شوند.
۶. انجام عملیات آپدیت
توقف سرویسهای مربوطه در صورت نیاز
جایگزینی یا نصب فایلهای جدید
اجرای اسکریپتهای Migration برای بروزرسانی دیتابیس
۷. راهاندازی مجدد سرویس و انجام تستهای اولیه
اجرای سرویسها
بررسی لاگها برای خطاهای احتمالی
انجام تستهای Smoke یا Sanity برای اطمینان از صحت عملکرد برنامه
۸. آماده بودن برای بازگردانی (Rollback)
در صورت بروز خطا:
نسخهی قبلی بازیابی شود.
دیتابیس یا تنظیمات به حالت قبل برگردانده شوند.
علت خطا مستندسازی و تحلیل شود.
---
قالب پیشنهادی برای نوشتن سناریو
عنوان: سناریوی آپدیت نرمافزار [نام برنامه]
هدف: ارتقا از نسخه [فعلی] به نسخه [جدید] بدون ایجاد اختلال یا از دست رفتن داده.
مراحل:
1. شناسایی نسخه فعلی و مقصد
2. تهیه نسخه پشتیبان از [لیست منابع]
3. بررسی پیشنیازها
4. آمادهسازی فایلهای آپدیت
5. توقف سرویسهای در حال اجرا (در صورت نیاز)
6. اعمال تغییرات و آپدیت سیستم
7. راهاندازی مجدد سرویس
8. بررسی صحت عملیات
9. اجرای سناریوی بازگردانی در صورت بروز خطا
نکات ویژه:
- زمانبندی آپدیت (ترجیحاً در ساعات کم ترافیک)
- اطلاعرسانی به کاربران پیش از شروع عملیات
- تستهای Post-Deployment
---
نوشتن یک سناریوی دقیق و منظم برای آپدیت، نه تنها ریسک پروژه را به شدت کاهش میدهد، بلکه اعتبار تیم توسعه یا عملیات را نیز افزایش میدهد.
به خاطر داشته باشید: در دنیای نرمافزار، یک آپدیت موفق برابر است با یک گام بزرگ به سوی حرفهای بودن.
Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel
Anophel | Where Developers Create Their Own Path
Anophel is an ecosystem for developers—a place for those who prefer building over consuming. If you want to create tools, think differently, and forge your own path in coding, Anophel is with you.
و
#rust #golang #go #گو #گولنگ
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Race Conditions in Golang: Break, Detect, and Fix Like a Pro! 🚀 | Anophel
🔥 Dive deep into race conditions in Golang with Anophel! In this video, we’re not just talking about race conditions — we’re causing them, detecting them with Go’s race detector, and fixing them using pro techniques like sync.Mutex, sync/atomic, and channels.…
#گولنگ #گو
#go #golang #software
Please open Telegram to view this post
VIEW IN TELEGRAM
بهبود کارایی کوئریها: به خصوص در جداول بزرگ. مثلاً اگر دادهها بر اساس تاریخ پارتیشنبندی شده باشند، یک کوئری محدود به یک بازه تاریخ فقط آن پارتیشن خاص را اسکن میکند.
مدیریت بهتر دادهها: حذف یا آرشیو کردن دادههای قدیمی بسیار سادهتر است.
تسهیل در نگهداری: میتوان فقط یک پارتیشن را بازسازی یا پشتیبانگیری کرد.
Indexها محدودیتهایی دارند (مثلاً فقط میتوان روی ستونهای پارتیشنشده ایندکس گذاشت).
FOREIGN KEY پشتیبانی نمیشود.
فقط در Storage Engine=InnoDB و NDB پشتیبانی میشود.
مقدار NULL باید در نظر گرفته شود چون میتواند باعث بروز خطا شود.
Please open Telegram to view this post
VIEW IN TELEGRAM
گزارش خوب نیمی از راه موفقیت در باگبانتیه. حتی اگر باگت خیلی بحرانی باشه، ولی درست گزارشش نکنی، ممکنه رد بشه یا اصلاً توجهی جلب نکنه. توی این پست به شکل خلاصه و کاربردی یاد میگیری چطور یک گزارش باگ بانتی استاندارد بنویسی:
---
۱. عنوان شفاف و دقیق
از همون اول واضح بگو مشکل چیه و کجاست.
مثال:
Stored XSS in comment section allows script execution as guest user
---
۲. خلاصهی باگ (Bug Summary)
توضیح بده باگ چیه، کی میتونه ازش سوءاستفاده کنه، و نتیجهش چیه.
مثال:
> یک کاربر ناشناس میتونه اسکریپت مخرب در فرم دیدگاه وارد کنه که موقع باز شدن صفحه، در مرورگر مدیر اجرا میشه.
---
۳. مراحل بازتولید (Steps to Reproduce)
قدمبهقدم توضیح بده چطور باگ رخ میده. دقیق و بدون ابهام.
مثال:
1. وارد فرم دیدگاه شوید.
2. این payload را ارسال کنید:
<script>alert(document.cookie)</script>
3. اکانت مدیر وارد پیشخوان شود و صفحه دیدگاهها را باز کند.
4. اسکریپت اجرا میشود.
---
۴. نتیجه واقعی (Actual Result)
بگو دقیقاً چه اتفاقی میافته.
مثال:
> اسکریپت اجرا میشود و دسترسی کاربر قربانی در معرض خطر است.
---
۵. نتیجه مورد انتظار (Expected Result)
باید چی میشد؟
مثال:
> کد HTML باید escape میشد و به عنوان متن ساده نمایش داده میشد.
---
۶. شدت آسیب (Impact)
بر اساس سناریو واقعی توضیح بده این باگ چه آسیبی میزنه.
مثال:
> مهاجم میتونه کوکی admin رو بدزده یا درخواستهای مخرب اجرا کنه. خطر بالا (High/Critical).
---
۷. پیشنهاد رفع (Suggested Fix)
اگر بلدی، پیشنهاد رفع هم بده.
مثال:
> استفاده از
()wp_kses_post
برای فیلتر کردن ورودی فرم دیدگاه.---
۸. ضمائم (Proof of Concept یا ویدیو/تصویر)
هر چی نشون بده باگ واقعیه، ضمیمه کن. فیلم، اسکرینشات، curl request یا Burp request.
---
جمعبندی
یک گزارش خوب باید:
ساده و واضح باشه
بازتولیدش راحت باشه
اطلاعات اضافی نداشته باشه
با رعایت این اصول، احتمال پذیرفته شدن باگت خیلی بیشتر میشه و امتیاز و جایزهت هم افزایش پیدا میکنه.
Anophel
Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel
Anophel | Where Developers Create Their Own Path
Anophel is an ecosystem for developers—a place for those who prefer building over consuming. If you want to create tools, think differently, and forge your own path in coding, Anophel is with you.
#react #react_query
Please open Telegram to view this post
VIEW IN TELEGRAM
فرض کنید یکی از سرویسهای ساده و تکرارشونده، بهطور غیرمنتظرهای شروع به مصرف بیش از حد حافظه کند. کد تغییری نکرده ، لاگها خطایی نشان نمی دهند، و پردازشها همان روال همیشگی را طی میکنند. اما پس از حذف دادهها از map و حتی اجرای دستی GC، حافظه آزاد نمی شود، مصرف بالا ثابت مانده است.
بررسی کد
ساختار برنامه ساده بود: بارگذاری یک میلیون رکورد در حافظه، پردازش آنها، حذف دادهها و تکرار این چرخه. پیادهسازی با زبان Go انجام شده بود و map اصلی به شکل زیر تعریف شده بود
:
treasureChest := make(map[int][128]byte)
// پر کردن map
for i := 0; i < 1_000_000; i++ {
treasureChest[i] = [128]byte{}
}
// پردازش دادهها...
// پاکسازی map
for i := 0; i < 1_000_000; i++ {
delete(treasureChest, i)
}
runtime.GC() // اجرای دستی جمعآوری زباله
با وجود اجرای کامل delete روی کل map و همچنین فراخوانی مستقیم runtime.GC(), حافظه اشغالشده توسط برنامه بهطور محسوسی کاهش نیافت.
در Go، ساختار داخلی map بهگونهای طراحی شده که برای حفظ عملکرد، حافظهی اختصاصیافته به bucketها را حتی پس از حذف مقادیر، بلافاصله آزاد نمیکند. این یعنی حتی زمانیکه map منطقی خالی است، ساختار دادهای پشت آن همچنان بخش قابلتوجهی از حافظه را نگه میدارد. جمعآورنده زباله (GC) نیز بهدلیل باقیماندن رفرنسهای داخلی، این حافظه را آزاد نخواهد کرد — مگر در شرایط خاصی که بازسازی map یا اختصاص مجدد صورت گیرد.
برای ارزیابی رفتار متفاوت، همان سناریو در Rust با استفاده از HashMap پیادهسازی شد. پس از بارگذاری دادهها و استفاده از clear() برای حذف کامل محتوا، حافظه بلافاصله آزاد شد و مصرف به وضعیت اولیه بازگشت. در Rust، حافظه تحت مالکیت صریح دادههاست و زمانی که دادهها حذف میشوند، حافظهی مربوط به آنها نیز آزاد میشود؛ مگر اینکه عمداً نگهداری شود.
use std::collections::HashMap;
fn main() {
let mut treasure_chest: HashMap<u32, [u8; 128]> = HashMap::new();
for i in 0..1_000_000 {
treasure_chest.insert(i, [0u8; 128]);
}
// پردازش دادهها...
treasure_chest.clear(); // آزادسازی حافظه
}
گیریاین رفتار تفاوتی کلیدی میان زبانهای Go و Rust را نشان میدهد:
در Go، مدیریت حافظه بهشکلی پنهان و بهینهشده برای عملکرد طراحی شده، که در موارد خاص میتواند منجر به نگهداری ناخواسته حافظه شود. در مقابل، Rust با طراحی مالکیت و کنترل دقیقتر روی حافظه، امکان آزادسازی صریح و قابل پیشبینی را فراهم میکند.
، ز
بانهایی با مدل حافظه صریحتر مانند Rust انتخاب بهتری خواهند بود.Please open Telegram to view this post
VIEW IN TELEGRAM
Anophel
Anophel | Where Developers Create Their Own Path
Anophel is an ecosystem for developers—a place for those who prefer building over consuming. If you want to create tools, think differently, and forge your own path in coding, Anophel is with you.