یکی از مهمترین مفاهیم در دنیای امروز داکر هستش.
اگر هنوز حوصله نکردین که شروع کنین و داکر رو یاد بگیرین یا شروع کردین ولی منبع درست و حسابی برای Best Practice داکر ندارین،
ریپازیتوری awesome docker یکی از بهترینهاست.
این ریپازیتوری برای درک سادهترین تا پیچیدهترین مطالب داکر مطالب مختلفی رو در اختیارتون میذاره.
#docker
#awesome
اگر هنوز حوصله نکردین که شروع کنین و داکر رو یاد بگیرین یا شروع کردین ولی منبع درست و حسابی برای Best Practice داکر ندارین،
ریپازیتوری awesome docker یکی از بهترینهاست.
این ریپازیتوری برای درک سادهترین تا پیچیدهترین مطالب داکر مطالب مختلفی رو در اختیارتون میذاره.
#docker
#awesome
GitHub
GitHub - veggiemonk/awesome-docker: :whale: A curated list of Docker resources and projects
:whale: A curated list of Docker resources and projects - veggiemonk/awesome-docker
❤1👍1
#گولنگ
اگر یک struct گولنگی تعریف کردین که داخلش از mutex استفاده میکنید، حتما باید متدهایی که روی این استراکت تعریف میشن بهصورت پوینتر باشن. اگر این موضوع فراموش بشه، یک نسخه کپی از mutex رو استفاده میکنید و در موقعیتهای همزمانی دچار مشکل میشین.
نمونه کد بد:
نمونه کد خوب:
#tip
#golang
اگر یک 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 رو باهم اشتباه میگیرن.
به کد زیر دقت کنید:
کافیه برای اسلایسهای بالا کد زیر رو اجرا کنید تا تفاوت nil و empty بودن رو متوجه بشین:
نتیجه میشه:
خب هرچهار مورد بهعنوان empty در نظر گرفته میشن یعنی اگر len اونارو بگیرین برابر با صفر میشه اما فقط دو مورد اول nil هستن.
دقت کنید:
۱) اسلایسهای nil در واقع empty هم هستن
۲) اسلایسهای nil در حافظه allocation ایجاد نمیکنن
۳) برای هردو نوع اسلایسهای nil و empty میتونیم از تابع append استفاده کنیم
خب پس کاربرد اسلایس nil چیه؟
فرض کنید تابعی دارین که داره یک یا چند اسلایس برمیگردونه، خب دیگه با گولنگ نیازی نیست که مثل زبانهای دیگه یک مقدار allocate شده برگردونید و با برگردوندن nil یا یک اسلایس nil حافظه کمتری مصرف میشه.
#golang
#tip
معمولا گولنگ دولوپرها تفاوت و کاربرد اسلایسهای 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
وقتی گوروتینها (goroutine) رو استفاده میکنین باید همیشه مطمئن بشین که پروسه مورد نظرتون چه زمانی به پایان میرسه و در نتیجه اصطلاحا گوروتین خارج میشه.
گوروتینها در گولنگ توسط grabage collector پاکسازی نمیشن و با وجود سبک بودنشون هنوز هم میتونن باعث ایجاد مموری لیک (memory leak) در برنامهتون بشن یا برای همیشه در پسزمینه در حال اجرا باقی بمونن!
این رفتار در گولنگ اشتباه نیست و به برنامهنویس اجازه میده پروسسهای طولانی مدت رو به راحتی در حال اجرا نگهداره، مثلا ایجاد یک وبسرویس که خیلی راحت روی یک گوروتین بلاک شده توسط یک چنل در وضعیت اجرا باقی میمونه اما در بقیه موارد باید حواستون باشه که با نوشتن کد مناسب چرخه عمر گوروتینها رو به درستی کنترل کنید.
ابزارهای زیادی برای مشخص گوروتینهای لیکی وجود دارد. این مقاله در شرکت اوبر (Uber) دید جالبی در این زمینه داره و خوندنش خالی از لطف نیست.
#golang
#tip
👍2