Gopher Academy
3.84K subscribers
924 photos
40 videos
280 files
2.08K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72
Download Telegram
می‌خوام یک وب سایت خیلی خوب برای گولنگ بهتون معرفی کنم، https://awesome-go.com/
این وب سایت فوق العادس برای دیدن کد تو هر موضوعی که فکرشو کنید در کانکارنسی، CLI، وب و هرچیز دیگه ای.
کافیه برین داخلش عنوان ابزار، کتابخونه یا حتی نمونه کد مورد نظر خودتون رو پیدا کنید و ریپازیتوری اوپن سورس مرتبطش رو باز کنید و داکیومنشن یا کدش رو بخونید.
واقعا جذابه پیشنهاد میکنم حتما ببینید

<Abolfazl Alizadeh/>
33
🔵 عنوان مقاله
Building Conway’s Game of Life with raylib-go

🟢 خلاصه مقاله:
یک پروژه تفننی و آموزشی است: پیاده‌سازی Conway’s Game of Life با استفاده از raylib-go در Go. برنامه یک پنجره باز می‌کند، شبکه‌ای دوبعدی از سلول‌ها می‌سازد و هر فریم سلول‌های زنده و مرده را به‌صورت مستطیل‌های رنگی رسم می‌کند. قوانین استاندارد (شمارش ۸ همسایه و اعمال قوانین کم‌جمعیتی، بقا، تراکم و تولیدمثل) با double-buffering اجرا می‌شوند تا محاسبات نسل بعدی تمیز و قابل اتکا باشد و در صورت نیاز امکان دورپیچی مرزها هم در نظر گرفته شده است. تعامل‌ها شامل توقف/ادامه، گام‌به‌گام، تنظیم سرعت، پاک‌سازی یا تصادفی‌سازی صفحه و تغییر وضعیت سلول‌ها با کلیک ماوس است؛ ذخیره/بارگذاری الگوهای ساده هم قابل افزودن است. حلقه به‌روزرسانی مستقل از نرخ رندر زمان‌بندی می‌شود تا اجرای روان و کارآمد حفظ شود و روی Windows، macOS و Linux به‌خوبی اجرا می‌شود. کد نهایی ارائه شده و برای توسعه ایده‌هایی مانند کتابخانه الگوها، کنترل‌های بهتر زوم/پن، گرادیان‌رنگ بر اساس سن سلول و ارزیابی عملکرد قابل گسترش است.

#ConwaysGameOfLife #raylib #raylibgo #Go #GameDev #CellularAutomata #GraphicsProgramming

🟣لینک مقاله:
https://golangweekly.com/link/174642/web


👑 @gopher_academy
1
مشکل "mutex copying" در Go یعنی کپی کردن یک mutex به جای استفاده از pointer به آن. این کار باعث می‌شه که mutex اصلی و کپی شده دو شیء جداگانه بشن و قفل‌گذاری درست کار نکنه.

چرا مشکل ساز است؟

وقتی یک mutex رو کپی می‌کنی، حالت داخلی اش (locked/unlocked) کپی نمی‌شه به درستی و هر کدوم مستقل عمل می‌کنن. این یعنی race condition و عدم هماهنگی بین goroutine ها.


1. همیشه از pointer receiver استفاده کن وقتی mutex داری:
func (c *Counter) method()


2. هرگز mutex رو به صورت value پاس نده:
func badFunc(mu sync.Mutex)


3. ا Go vet ابزار خوبیه که این مشکل رو پیدا می‌کنه:
  
   go vet ./...
  


4. اگه struct رو embed می‌کنی**، حواست باشه که اون رو کپی نکنی

5. **انواع Mutex ها همه این مشکل رو دارن
:
sync.Mutex,
sync.RWMutex,
sync.WaitGroup
,
sync.Cond


این یکی از رایج‌ترین اشتباهات تو Go هست، خصوصا برای کسایی که تازه شروع کردن!
2👍1
Gopher Academy
مشکل "mutex copying" در Go یعنی کپی کردن یک mutex به جای استفاده از pointer به آن. این کار باعث می‌شه که mutex اصلی و کپی شده دو شیء جداگانه بشن و قفل‌گذاری درست کار نکنه. چرا مشکل ساز است؟ وقتی یک mutex رو کپی می‌کنی، حالت داخلی اش (locked/unlocked) کپی…
💙نمونه استفاده درست👇

package main

import (
"fmt"
"sync"
"time"
)

type Counter struct {
mu sync.Mutex
value int
}

func (c *Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
fmt.Printf("Value: %d\n", c.value)
}

func goodFunction(c *Counter) {
c.mu.Lock()
defer c.mu.Unlock()
c.value = 100
}

func main() {
counter := &Counter{}

var wg sync.WaitGroup

for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Increment()
}()
}

wg.Add(1)
go func() {
defer wg.Done()
goodFunction(counter)
}()

wg.Wait()
fmt.Printf("Final value: %d\n", counter.value)
}

type SafeMap struct {
mu sync.RWMutex
data map[string]int
}

func NewSafeMap() *SafeMap {
return &SafeMap{
data: make(map[string]int),
}
}

func (sm *SafeMap) Set(key string, value int) {
sm.mu.Lock()
defer sm.mu.Unlock()
sm.data[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
sm.mu.RLock()
defer sm.mu.RUnlock()
val, ok := sm.data[key]
return val, ok
}
🏆1
Gopher Academy
مشکل "mutex copying" در Go یعنی کپی کردن یک mutex به جای استفاده از pointer به آن. این کار باعث می‌شه که mutex اصلی و کپی شده دو شیء جداگانه بشن و قفل‌گذاری درست کار نکنه. چرا مشکل ساز است؟ وقتی یک mutex رو کپی می‌کنی، حالت داخلی اش (locked/unlocked) کپی…
❤️نمونه اشتباه
package main

import (
"fmt"
"sync"
"time"
)

type Counter struct {
mu sync.Mutex
value int
}

func (c Counter) Increment() {
c.mu.Lock()
defer c.mu.Unlock()
c.value++
fmt.Printf("Value: %d\n", c.value)
}
func badFunction(c Counter) {
c.mu.Lock()
defer c.mu.Unlock()
c.value = 100
}

func main() {
counter := Counter{}

for i := 0; i < 5; i++ {
go counter.Increment()
}

go badFunction(counter)

time.Sleep(time.Second)
fmt.Printf("Final value: %d\n", counter.value)
}
1
Forwarded from VIP
🚀 به دنیای توسعه و تکنولوژی خوش اومدی!

اگر به موضوعات زیر علاقه‌مندی:

🔹 Golang
🔹 Linux & DevOps
🔹 Software Engineering
🔹 AI & Machine Learning
🔹 فرصت‌های شغلی ریموت (خارجی و داخلی)

ما برات یه مجموعه کانال‌های تخصصی ساختیم تا همیشه به‌روز، حرفه‌ای و الهام‌بخش بمونی!
📚 یادگیری، فرصت، شبکه‌سازی و پیشرفت، همش اینجاست...

📌 از این لینک همه چنل‌هامونو یه‌جا ببین و جوین شو:

👉 https://t.iss.one/addlist/AJ7rh2IzIh02NTI0
5
📢 اگر تلگرام پرمیوم دارید، کانال ما رو Boost کنید ! 🚀

با Boost کردن کانال، به رشد و دیده شدن ما بیشتر کمک کنید💙

https://t.iss.one/boost/gopher_academy
1
Forwarded from Software Engineer Labdon
این کتاب خیلی ساده و روان توضیح میده چرا Rust اینقدر سر و صدا کرده و چرا خیلی‌ها دارن سمتش میرن:

نشون میده چطوری با سیستم ownership و borrowing میشه حافظه رو بدون دردسر مدیریت کرد

توضیح میده چرا توی Rust باگ‌هایی مثل null pointer یا data race کلاً از همون اول جلوی راهت سبز نمی‌شن

یاد میده چطوری میشه به راحتی برنامه‌های چندنخی و امن نوشت، بدون استرس خطاهای عجیب غریب

تأکید می‌کنه که همه‌ی این امکانات رو می‌گیری، ولی سرعتش در حد C/C++ باقی می‌مونه
54