CloudyGo
212 subscribers
8 photos
1 video
1 file
41 links
Software Engineering & Development Best Practices, Especially in Golang!


https://cloudygo.ir

@rezakhademix
Download Telegram
Channel created
یکی از مهمترین مفاهیم در دنیای امروز داکر هستش.

اگر هنوز حوصله نکردین که شروع کنین و داکر رو یاد بگیرین یا شروع کردین ولی منبع درست و حسابی برای Best Practice داکر ندارین،
ریپازیتوری awesome docker یکی از بهترین‌هاست.

این ریپازیتوری برای درک ساده‌ترین تا پیچیده‌ترین مطالب داکر مطالب مختلفی رو در اختیارتون میذاره.

#docker
#awesome
1👍1
#گولنگ

اگر یک struct گولنگی تعریف کردین که داخلش از mutex استفاده می‌کنید، حتما باید متدهایی که روی این استراکت تعریف میشن به‌صورت پوینتر باشن. اگر این موضوع فراموش بشه، یک نسخه کپی از mutex رو استفاده می‌کنید و در موقعیت‌های همزمانی دچار مشکل میشین.


نمونه کد بد:
type User struct {
sync.Mutex

data map[string]string
}

func NewUser() User {
return User{
data: make(map[string]string),
}
}

func (m User) Get(k string) string {
m.Lock()
defer m.Unlock()

return m.data[k]
}

نمونه کد خوب:
type User struct {
mu sync.Mutex

data map[string]string
}

func NewUser() *User {
return &User{
data: make(map[string]string),
}
}

func (m *User) Get(k string) string {
m.mu.Lock()
defer m.mu.Unlock()

return m.data[k]
}

#tip
#golang
👍2🔥1
#گولنگ

معمولا گولنگ دولوپرها تفاوت و کاربرد اسلایس‌های empty و nil رو باهم اشتباه میگیرن.
به کد زیر دقت کنید:

‍‍
// #1
var s []string

// #2
s = []string(nil)

// #3
s = []string{}

// #4
s = make([]string, 0)

کافیه برای اسلایس‌های بالا کد زیر رو اجرا کنید تا تفاوت nil و empty بودن رو متوجه بشین:

‍‍
// In Golang "\t" means tab character "\n" means new line

fmt.Printf("IsEmpty=%v \t IsNil=%v \n", len(s) == 0, s == nil)

نتیجه میشه:

#1
IsEmpty=true IsNil=true

#2
IsEmpty=true IsNil=true

#3
IsEmpty=true IsNil=false

#4
IsEmpty=true IsNil=false


خب هرچهار مورد به‌عنوان empty در نظر گرفته میشن یعنی اگر len اونارو بگیرین برابر با صفر میشه اما فقط دو مورد اول nil هستن.

دقت کنید:
۱) اسلایس‌های nil در واقع empty هم هستن
۲) اسلایس‌های nil در حافظه allocation ایجاد نمی‌کنن
۳) برای هردو نوع اسلایس‌های nil و empty میتونیم از تابع append استفاده کنیم


خب پس کاربرد اسلایس nil چیه؟
فرض کنید تابعی دارین که داره یک یا چند اسلایس برمیگردونه، خب دیگه با گولنگ نیازی نیست که مثل زبان‌های دیگه یک مقدار allocate شده برگردونید و با برگردوندن nil یا یک اسلایس nil حافظه کمتری مصرف میشه.

func scores() []int {
s, err := apiCall();
if err != nil {
return nil
}

return s
}



#golang
#tip
👏2
#گولنگ

وقتی گوروتین‌ها (goroutine) رو استفاده می‌کنین باید همیشه مطمئن بشین که پروسه مورد نظرتون چه‌ زمانی به پایان میرسه و در نتیجه اصطلاحا گوروتین خارج میشه.

گوروتین‌ها در گولنگ توسط grabage collector پاکسازی نمیشن و با وجود سبک بودنشون هنوز هم میتونن باعث ایجاد مموری لیک (memory leak) در برنامه‌تون بشن یا برای همیشه در پس‌زمینه در حال اجرا باقی بمونن!

این رفتار در  گولنگ اشتباه نیست و به برنامه‌نویس اجازه میده پروسس‌های طولانی مدت رو به راحتی در حال اجرا نگهداره، مثلا ایجاد یک وب‌سرویس که خیلی راحت روی یک گوروتین بلاک شده توسط یک چنل در وضعیت اجرا باقی میمونه اما در بقیه موارد باید حواستون باشه که با نوشتن کد مناسب چرخه عمر گوروتین‌ها رو به درستی کنترل کنید.

ابزارهای زیادی برای مشخص گوروتین‌های لیکی وجود دارد. این مقاله در شرکت اوبر (Uber) دید جالبی در این زمینه داره و خوندنش خالی از لطف نیست.

#golang
#tip
👍2