Gopher Academy
❌ بخش اول ❌ 🎯اضافه کردن Context به یک پروژه آزاد🎯 . 🔹 https://www.youtube.com/watch?v=O7aaLb3_eGU . 🔴 مدرس Forud Ghafouri ➖➖➖➖➖➖➖➖➖ 🔰 @gopher_academy
👆🏻👆🏻👆🏻👆🏻
❌چندتا نکته ای که توی بخش اول گفته شد❌
.
🔹سعی کنید برای interface ها کامنت بنویسید
🔹اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🔹سعی کنید context رو توی فایل اصلی راه اندازی کنید
🔹توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🔹بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🔹تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🔹تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌چندتا نکته ای که توی بخش اول گفته شد❌
.
🔹سعی کنید برای interface ها کامنت بنویسید
🔹اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🔹سعی کنید context رو توی فایل اصلی راه اندازی کنید
🔹توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🔹بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🔹تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🔹تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
❌چندتا نکته گولنگی❌
.
🔹زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🔹هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🔹سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🔹سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🔹 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
.
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
.
🔹زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🔹هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🔹سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🔹سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🔹 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
.
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🔻چندتا نکته گولنگی🔻
🟢زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🟢هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🟢سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🟢سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🟢 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
🟢سعی کنید برای interface ها کامنت بنویسید
🟢اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🟢سعی کنید context رو توی فایل اصلی راه اندازی کنید
🟢توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🟢بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🟢تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🟢تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
🟢زمانی که توی فایل اصلی context دارید و این فایل به باینری تبدیل شود دیگر کنترل رو برنامه رو ندارید بهتره از singleها استفاده کنید که باعث می شود زمانی که شما ctl+c رو می زنید کل contextها killشوند. برای این کار می توانید از پکیج syscallاستفاده کنید.
🟢هروقت توی پروژه تون یه کتابخونه اضافه می کنید با پاک می کنید حتما بعدش go mod tidy رو بزنید تا مرتب کنه فایل go.mod و go.sum رو
🟢سعی کنید براب نام متغیر یا نام تابع از اسامی رزو شده گولنگ استفاده نکنید
🟢سعی کنید برای خواندن فایل بجای ioutil.readfile از os.open(pathfile.clean(mypath)) استفاده کنید برای Footprint memory
🟢 سعی کنید برای نمایش فایل های json-xml-yaml بجای unmarshal از json.newdeocer or json.newdecoder استفاده کنید برای Footprint memory
🟢سعی کنید برای interface ها کامنت بنویسید
🟢اگر تابعی دارید که قرار در ورودی این تابع یک استراکچر رو بگیره سعی کنید از pointer استفاده کنید. همیشه یه pointer کپی کردن بهتر از یه استراکچر کپی کردن هست چون این عمل باعث memory allcotion میشه. نمونه زیر رو درنظر بگیرید
❌func save (mu model.user){}
✅func save (mu *model.user){}
🟢سعی کنید context رو توی فایل اصلی راه اندازی کنید
🟢توی package ها تا سعی دارید از os.exit ااستفاده نکنید چون باعث میشه جلوی تمام defer ها رو بگیره و حتی جلوی باینری کردن رو هم میگیره
🟢بجای اینکه بیاید بعد هر تابع که می نویسید براش چک err انجام دهید یعنی بجای کد زیر
if err != nil {
log.Fatal(err)
}
از این دستور زیر استفاده کنید چون توی بدنه خودش از کد فوق استفاده می کنه یعنی اون nil رو برمیگردونه
return errors.warp(err,"your msg error")
🟢تا حد ممکن توی کتابخونه ها از دستور چاپ استفاده نکنید
🟢تابع بدون بدنه بعنی مثل زیر
func getInfo(a int)
اینجوری تابع رو هر وقت دیدید برید توی فولدر runtime اونجا هست
#note #tip
➖➖➖➖➖➖➖➖➖
🔰 @gopher_academy
#tip
دوستان به مثال بالا توجه کنید یه نکته ای وجود دارد که گاها باعث ایجاد خطا های Logical خواهد شد.
در مثال فوق:
۱. ما slice با نام items داریم که داخلش ۲۰ تا آیتم دارد.
۲. حال یک متغیر داریم به نام totalItem که قرار است برای ظرفیت و گرفتن تعداد مشخصی از item های items میخواهیم استفاده کنیم.
۳. یک متغیر از نوع slice ایجاد کردیم با فرض اینکه میخواهیم ظرفیت این slice یک تعداد مشخص باشه و کامپایلر ظرفیت بیشتری در نظر نگیرد.
۴. حال داخل حلقه ما تک تک آیتم های items را به num1 گرفتیم append کردیم.
۵. در ادامه num1 را به همراه len ش چاپ کردیم.
اتفاقی که افتاد ۱۰ تا المنت اول صفر و item ها به ادامه المنت ها اضافه شد.
حال اگر به المنت های slice المنتی اضافه کنید به ادامه اون المنت های قبلی اضافه خواهد شد و تعداد المنت بیشتر از اون چیزی که خواستید خواهد بود.
https://go.dev/play/p/bjlc8E1Q776
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy
دوستان به مثال بالا توجه کنید یه نکته ای وجود دارد که گاها باعث ایجاد خطا های Logical خواهد شد.
در مثال فوق:
۱. ما slice با نام items داریم که داخلش ۲۰ تا آیتم دارد.
۲. حال یک متغیر داریم به نام totalItem که قرار است برای ظرفیت و گرفتن تعداد مشخصی از item های items میخواهیم استفاده کنیم.
۳. یک متغیر از نوع slice ایجاد کردیم با فرض اینکه میخواهیم ظرفیت این slice یک تعداد مشخص باشه و کامپایلر ظرفیت بیشتری در نظر نگیرد.
۴. حال داخل حلقه ما تک تک آیتم های items را به num1 گرفتیم append کردیم.
۵. در ادامه num1 را به همراه len ش چاپ کردیم.
اتفاقی که افتاد ۱۰ تا المنت اول صفر و item ها به ادامه المنت ها اضافه شد.
make(slice, length, capacity)وقتی شما length را مقدار دهی میکنی عملا داری تعداد مشخصی از المنت ها را با مقدار پیش فرض میسازید.
حال اگر به المنت های slice المنتی اضافه کنید به ادامه اون المنت های قبلی اضافه خواهد شد و تعداد المنت بیشتر از اون چیزی که خواستید خواهد بود.
https://go.dev/play/p/bjlc8E1Q776
➖➖➖➖➖➖➖➖➖
🕊 @gopher_academy
👍12👎1💊1
۵۰ نکته برای کسانی که قصد یادگیری زبان برنامهنویسی Go را دارند.
#golang #go #tip #tips
https://golang50shad.es
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
#golang #go #tip #tips
https://golang50shad.es
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍6🔥2❤1🍾1
🟢Unintended variable shadowing (#1)
🔵Avoiding shadowed variables can help prevent mistakes like referencing the wrong variable or confusing readers.
#tip #go
➖➖➖➖➖➖➖
👑 @gopher_academy
🔵Avoiding shadowed variables can help prevent mistakes like referencing the wrong variable or confusing readers.
#tip #go
➖➖➖➖➖➖➖
👑 @gopher_academy
👍3🎉2