📚 کتاب Golang By Example (online)
➕ یادگیری زبان Go با مثال
زبان Go بیشتر برای کاربردش توی بلاکچین معروفه، اما به طور کلی یکی از زبان های محبوب دنیا شناخته میشه. اگر به دنبال یادگیری این زبان هستین این کتاب میتونه بهتون کمک کنه. زبان روان و ساده ای داره و برای هر مبحث مثال های زیادی هم زده 💫
این کتاب آنلاینه و از لینک زیر میتونید بهش دسترسی داشته باشین:
👉🏻 golangbyexample.com
#book #golang
☕️ @CodeExplore
➕ یادگیری زبان Go با مثال
زبان Go بیشتر برای کاربردش توی بلاکچین معروفه، اما به طور کلی یکی از زبان های محبوب دنیا شناخته میشه. اگر به دنبال یادگیری این زبان هستین این کتاب میتونه بهتون کمک کنه. زبان روان و ساده ای داره و برای هر مبحث مثال های زیادی هم زده 💫
این کتاب آنلاینه و از لینک زیر میتونید بهش دسترسی داشته باشین:
👉🏻 golangbyexample.com
#book #golang
☕️ @CodeExplore
🔥10
کداکسپلور | CodeExplore
🚀 ۳ ابزار کاربردی برای کار با API و JSON 🔸 Postman ابزاری قدرتمند برای تست و مدیریت APIهای REST و GraphQL با محیط گرافیکی حرفهای. ✅ پشتیبانی از انواع متد، مدیریت Token و ساخت کالکشن تست. 🔗 postman.com 🔸 Insomnia جایگزینی سبک، سریع و ساده برای Postman…
🚀 تفاوت Anonymous Struct و Named Struct در Go + کاربرد واقعی در ساخت API
در زبان Go، دو نوع ساختار (struct) پرکاربرد داریم که بسته به نیاز، استفاده از یکی نسبت به دیگری بهتره. اینجا با یه مثال واقعی از دنیای API برات توضیح میدیم که چرا و کجا از هر کدوم استفاده کنیم:
🔸 ساختار نامدار (Named Struct)
ساختاری با اسم مشخص که میتونه چندینبار در بخشهای مختلف پروژه استفاده بشه. برای مدلسازی دیتاهایی مثل کاربر، محصول یا درخواست لاگین خیلی مفیده.
✅ مزایا:
• قابل استفاده مجدد
• خوانایی بالا
• سازماندهی بهتر کد
🔸 ساختار بینام (Anonymous Struct)
وقتی فقط یکبار قراره از یه ساختار ساده استفاده کنی و نمیخوای struct جداگانه تعریف کنی، این روش خیلی سریع و کارآمده. مخصوصاً توی پارس کردن سریع کوئریها یا تستهای سبک.
✅ مزایا:
• کد سریعتر و تمیزتر
• بدون نیاز به تعریف نوع جدا
• مناسب برای موارد موقتی یا کوچک
func SearchHandler(c *gin.Context) {
var query struct {
Q string
Page int
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, gin.H{"error": "bad query"})
return
}
// استفاده از query.Q و query.Page
}
🎯 جمعبندی:
اگر ساختار رو در چند جای پروژه استفاده میکنی ➡️ ساختار نامدار (Named Struct)
اگر فقط برای یکبار یا در یک فانکشن خاص استفاده داری ➡️ ساختار بینام (Anonymous Struct)
#GoLang #Struct #Gin #API #Backend #برنامهنویسی #گو
☕️Telegram | Website | Discord
در زبان Go، دو نوع ساختار (struct) پرکاربرد داریم که بسته به نیاز، استفاده از یکی نسبت به دیگری بهتره. اینجا با یه مثال واقعی از دنیای API برات توضیح میدیم که چرا و کجا از هر کدوم استفاده کنیم:
🔸 ساختار نامدار (Named Struct)
ساختاری با اسم مشخص که میتونه چندینبار در بخشهای مختلف پروژه استفاده بشه. برای مدلسازی دیتاهایی مثل کاربر، محصول یا درخواست لاگین خیلی مفیده.
✅ مزایا:
• قابل استفاده مجدد
• خوانایی بالا
• سازماندهی بهتر کد
type LoginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
func LoginHandler(c *gin.Context) {
var req LoginRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(400, gin.H{"error": "invalid request"})
return
}
// استفاده از req.Username و req.Password
}
🔸 ساختار بینام (Anonymous Struct)
وقتی فقط یکبار قراره از یه ساختار ساده استفاده کنی و نمیخوای struct جداگانه تعریف کنی، این روش خیلی سریع و کارآمده. مخصوصاً توی پارس کردن سریع کوئریها یا تستهای سبک.
✅ مزایا:
• کد سریعتر و تمیزتر
• بدون نیاز به تعریف نوع جدا
• مناسب برای موارد موقتی یا کوچک
func SearchHandler(c *gin.Context) {
var query struct {
Q string
form:"q"
Page int
form:"page"
}
if err := c.ShouldBindQuery(&query); err != nil {
c.JSON(400, gin.H{"error": "bad query"})
return
}
// استفاده از query.Q و query.Page
}
🎯 جمعبندی:
اگر ساختار رو در چند جای پروژه استفاده میکنی ➡️ ساختار نامدار (Named Struct)
اگر فقط برای یکبار یا در یک فانکشن خاص استفاده داری ➡️ ساختار بینام (Anonymous Struct)
#GoLang #Struct #Gin #API #Backend #برنامهنویسی #گو
☕️Telegram | Website | Discord
❤🔥6🔥3💔2
سایت boot dev ، یادگیری با شروع کد نویسی 🔥
🔸️ سایت Boot.dev یه پلتفرم آموزش آنلاینه که با تمرکز روی کدنویسی عملی و بازیوار، بهت کمک میکنه از همون اول با نوشتن کد، برنامهنویسی رو تو مغزت حک کنی! بیشتر از 100 هزار نفر تا حالا از دورههاش استفاده کردن.
🔹️ دوره هاش شامل Python، JavaScript، Go، ساخت API، دیتابیس و مفاهیم پایهای علوم کامپیوتره، اونم بدون ویدیوهای طولانی و خستهکننده — فقط تمرینهای مرحلهبهمرحله و بازخورد فوری! اگه دنبال یادگیری واقعیای، Boot.dev یه گزینه جدیه.
#bootdev #site #python #go #golang #programming
☕️Telegram | Website | Discord
🔸️ سایت Boot.dev یه پلتفرم آموزش آنلاینه که با تمرکز روی کدنویسی عملی و بازیوار، بهت کمک میکنه از همون اول با نوشتن کد، برنامهنویسی رو تو مغزت حک کنی! بیشتر از 100 هزار نفر تا حالا از دورههاش استفاده کردن.
🔹️ دوره هاش شامل Python، JavaScript، Go، ساخت API، دیتابیس و مفاهیم پایهای علوم کامپیوتره، اونم بدون ویدیوهای طولانی و خستهکننده — فقط تمرینهای مرحلهبهمرحله و بازخورد فوری! اگه دنبال یادگیری واقعیای، Boot.dev یه گزینه جدیه.
#bootdev #site #python #go #golang #programming
☕️Telegram | Website | Discord
❤🔥10🔥3💔3
🚀توضیح Closure Function در Go — ابزار قدرتمند برای نگهداری وضعیت (State)
در زبان Go، توابع میتونن داخل خودشون توابع دیگه تعریف و برگردونن. اگر اون تابع داخلی به متغیرهای خارج از خودش دسترسی داشته باشه، بهش میگیم Closure.
یعنی توابعی که محیط اطرافشون رو بهخاطر میسپارن حتی بعد از خروج از اون محیط.
✅ مثال واقعی: شمارنده با Closure
📌 هر بار که تابع ()c اجرا میشه، مقدار count رو یکی زیاد میکنه، چون اون تابع داخلی به count دسترسی داره و وضعیتش رو حفظ کرده.
🎯 کاربردهای واقعی Closure در Go:
✅ نگهداری وضعیت بدون استفاده از struct
✅ تولید توابع سفارشیشده با دادهی خاص
✅ ساختن توابع داینامیک مثل Middleware، Filter و Validator
✅ پیادهسازی رفتارهای فانکشنال (مثل map، reduce، chain)
🧠 چرا مهمه؟
Closureها بهت این امکان رو میدن که کد تمیزتر، ماژولارتر و با قابلیت ترکیبپذیری بالا بنویسی — بدون نیاز به تعریف نوع یا ساختارهای پیچیده.
#GoLang #Struct #Gin #API #Backend #برنامهنویسی #گو
☕️Telegram | Website | Discord
در زبان Go، توابع میتونن داخل خودشون توابع دیگه تعریف و برگردونن. اگر اون تابع داخلی به متغیرهای خارج از خودش دسترسی داشته باشه، بهش میگیم Closure.
یعنی توابعی که محیط اطرافشون رو بهخاطر میسپارن حتی بعد از خروج از اون محیط.
✅ مثال واقعی: شمارنده با Closure
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3
}
📌 هر بار که تابع ()c اجرا میشه، مقدار count رو یکی زیاد میکنه، چون اون تابع داخلی به count دسترسی داره و وضعیتش رو حفظ کرده.
🎯 کاربردهای واقعی Closure در Go:
✅ نگهداری وضعیت بدون استفاده از struct
✅ تولید توابع سفارشیشده با دادهی خاص
✅ ساختن توابع داینامیک مثل Middleware، Filter و Validator
✅ پیادهسازی رفتارهای فانکشنال (مثل map، reduce، chain)
🧠 چرا مهمه؟
Closureها بهت این امکان رو میدن که کد تمیزتر، ماژولارتر و با قابلیت ترکیبپذیری بالا بنویسی — بدون نیاز به تعریف نوع یا ساختارهای پیچیده.
#GoLang #Struct #Gin #API #Backend #برنامهنویسی #گو
☕️Telegram | Website | Discord
❤🔥5💔3⚡1🔥1
🚀 توابع Currying در Go — ساخت توابع مرحلهای و داینامیک با قدرت Closures
در Go، مثل زبانهای فانکشنال، میتونی توابعی بسازی که به جای گرفتن همه آرگومانها یکجا، هر آرگومان رو در یک مرحله بگیرن. به این تکنیک میگیم:
🎯 Currying
یعنی تبدیل تابعی با چند آرگومان به توابع تو در تو، که هر کدوم فقط یک آرگومان میگیرن.
✅ مثال واقعی: ضرب با عدد ثابت
📌 اینجا تابع multiply(10) خودش یه تابع جدید میسازه (times10) که همیشه با ۱۰ ضرب میکنه.
🧠 به چه دردی میخوره؟
✅ ساخت توابع با پارامترهای پیشفرض
✅ پیادهسازی سادهتر توابع داینامیک
✅ خوانایی و تستپذیری بهتر
✅ کمک به معماری فانکشنال در Go با ترکیبپذیری بالا
🧩 حتی میتونی با Genericها توابع کلی بسازی:
حالا میتونی توابع ۲ پارامتری رو به صورت مرحلهای صدا بزنی:
#GoLang #Currying #Closure #Functions #Backend #برنامه_نویسی #گو
☕️Telegram | Website | Discord
در Go، مثل زبانهای فانکشنال، میتونی توابعی بسازی که به جای گرفتن همه آرگومانها یکجا، هر آرگومان رو در یک مرحله بگیرن. به این تکنیک میگیم:
🎯 Currying
یعنی تبدیل تابعی با چند آرگومان به توابع تو در تو، که هر کدوم فقط یک آرگومان میگیرن.
✅ مثال واقعی: ضرب با عدد ثابت
func multiply(x int) func(int) int {
return func(y int) int {
return x * y
}
}
func main() {
times10 := multiply(10)
fmt.Println(times10(3)) // 30
fmt.Println(times10(7)) // 70
}
📌 اینجا تابع multiply(10) خودش یه تابع جدید میسازه (times10) که همیشه با ۱۰ ضرب میکنه.
🧠 به چه دردی میخوره؟
✅ ساخت توابع با پارامترهای پیشفرض
✅ پیادهسازی سادهتر توابع داینامیک
✅ خوانایی و تستپذیری بهتر
✅ کمک به معماری فانکشنال در Go با ترکیبپذیری بالا
🧩 حتی میتونی با Genericها توابع کلی بسازی:
func curry2[A, B, C any](f func(A, B) C) func(A) func(B) C {
return func(a A) func(B) C {
return func(b B) C {
return f(a, b)
}
}
}
حالا میتونی توابع ۲ پارامتری رو به صورت مرحلهای صدا بزنی:
add := func(x, y int) int { return x + y }
curriedAdd := curry2(add)
fmt.Println(curriedAdd(2)(3)) // 5
#GoLang #Currying #Closure #Functions #Backend #برنامه_نویسی #گو
☕️Telegram | Website | Discord
🔥7
چی(Chi) چیه؟🤔
کتابخونهی Chi یکی از سبک ترین و در عین حال قدرتمندترین ابزارهای ساخت REST API در زبان Go هست. این لایبرری با هدف ساده سازی مدیریت روتها و middlewareها طراحی شده و در عین حال از net/http استاندارد Go استفاده میکنه.
کتابخونهی Chi به درد برنامه نویسایی میخوره که دنبال ساختاری مرتب، توسعه پذیر و مناسب پروژه های متوسط تا بزرگ هستن.
💣 Chi چند ویژگی مهم داره:
✅ تعریف روتها به شکل تمیز و خوانا
✅ پشتیبانی از middleware به صورت تو در تو (nested)
✅ پشتیبانی کامل از context و گروهبندی مسیرها
✅ سازگار با net/http و بدون نیاز به یاد گرفتن چیزی عجیب غریب
👀 یه مثال خیلی ساده:
فرض کن یه API داری که لیست کاربران رو برمیگردونه. با net/http باید مسیر رو دستی مدیریت کنی و اگر middleware هم بخوای اضافه کنی، کارت سخت میشه. ولی با Chi خیلی راحت مسیر /users رو تعریف میکنی، middleware هم بهش میچسبونی و تمام.
📊 مقایسه با net/http:
با net/http همه چیز پایهای و دستی انجام میشه. برای پروژه های خیلی کوچیک خوبه ولی وقتی کارت بزرگ شد، مدیریت مسیرها و middlewareها اذیتت میکنه.
ولی Chi از همون پایه با هدف راحتی توسعه ساخته شده. مثل یه اسکلتیه که کمک میکنه پروژهات رو ماژولارتر بنویسی. اگه دنبال یه ساختار MVC تمیز هستی، Chi انتخاب خیلی خوبیه.
✅ خیلی از فریم ورک های Go محور یا پروژه های حرفهای از Chi استفاده میکنن چون هم سبک و سریع ـه، هم ساختار پروژه رو مرتب نگه میداره.
اگه تا حالا باش کار کردی تو کامنتا بنویس👇🏻
#chi #golang
☕️Telegram | Website | Discord
کتابخونهی Chi یکی از سبک ترین و در عین حال قدرتمندترین ابزارهای ساخت REST API در زبان Go هست. این لایبرری با هدف ساده سازی مدیریت روتها و middlewareها طراحی شده و در عین حال از net/http استاندارد Go استفاده میکنه.
کتابخونهی Chi به درد برنامه نویسایی میخوره که دنبال ساختاری مرتب، توسعه پذیر و مناسب پروژه های متوسط تا بزرگ هستن.
💣 Chi چند ویژگی مهم داره:
✅ تعریف روتها به شکل تمیز و خوانا
✅ پشتیبانی از middleware به صورت تو در تو (nested)
✅ پشتیبانی کامل از context و گروهبندی مسیرها
✅ سازگار با net/http و بدون نیاز به یاد گرفتن چیزی عجیب غریب
👀 یه مثال خیلی ساده:
فرض کن یه API داری که لیست کاربران رو برمیگردونه. با net/http باید مسیر رو دستی مدیریت کنی و اگر middleware هم بخوای اضافه کنی، کارت سخت میشه. ولی با Chi خیلی راحت مسیر /users رو تعریف میکنی، middleware هم بهش میچسبونی و تمام.
📊 مقایسه با net/http:
با net/http همه چیز پایهای و دستی انجام میشه. برای پروژه های خیلی کوچیک خوبه ولی وقتی کارت بزرگ شد، مدیریت مسیرها و middlewareها اذیتت میکنه.
ولی Chi از همون پایه با هدف راحتی توسعه ساخته شده. مثل یه اسکلتیه که کمک میکنه پروژهات رو ماژولارتر بنویسی. اگه دنبال یه ساختار MVC تمیز هستی، Chi انتخاب خیلی خوبیه.
✅ خیلی از فریم ورک های Go محور یا پروژه های حرفهای از Chi استفاده میکنن چون هم سبک و سریع ـه، هم ساختار پروژه رو مرتب نگه میداره.
اگه تا حالا باش کار کردی تو کامنتا بنویس👇🏻
#chi #golang
☕️Telegram | Website | Discord
⚡5🔥3❤🔥1
کلمه کلیدی Defer چیه؟
کلمه کلیدی Defer یه کلمه کلیدی تو Go هست که باعث میشه یه تابع بعد از اتمام تابع فعلی اجرا بشه. این یعنی وقتی return زدی یا اروری اومد، اون تابع deferred آخر کار اجرا میشه.
✨ چرا از defer استفاده کنیم؟
کلمه کلیدی defer خیلی به درد کارایی مثل اینا میخوره:
✅ بستن فایلها (file.Close())
✅ بستن کانکشنها یا منابع شبکه
✅ آزاد کردن lockها (مثل mutex.Unlock())
✅ گرفتن log یا اندازهگیری زمان اجرا
مثلاً:
🧠 چطوری کار میکنه؟
اگه چند تا defer پشتسرهم بنویسی، به صورت LIFO اجرا میشن؛ یعنی آخری اول اجرا میشه.
خروجی:
⚠️ نکتهی مهم
تو لوپهایی که زیاد تکرار میشن، زیاد از defer استفاده نکن، چون ممکنه کارایی بیاد پایین. بهجاش مستقیم اون تابع رو همون موقع صدا بزن.
🧹 جمعبندی
defer ابزار تمیزکاری تو Go هست. کمک میکنه کدت مرتب، ایمن و بدون نشتی منابع باشه. مخصوصا تو پروژههای واقعی خیلی کاربردیه!
اگه تجربه کار با defer داری، تو کامنتا بنویس 👇🏻
#golang #defer
☕️Telegram | Website | Discord
کلمه کلیدی Defer یه کلمه کلیدی تو Go هست که باعث میشه یه تابع بعد از اتمام تابع فعلی اجرا بشه. این یعنی وقتی return زدی یا اروری اومد، اون تابع deferred آخر کار اجرا میشه.
✨ چرا از defer استفاده کنیم؟
کلمه کلیدی defer خیلی به درد کارایی مثل اینا میخوره:
✅ بستن فایلها (file.Close())
✅ بستن کانکشنها یا منابع شبکه
✅ آزاد کردن lockها (مثل mutex.Unlock())
✅ گرفتن log یا اندازهگیری زمان اجرا
مثلاً:
func readFile() {
f, _ := os.Open("data.txt")
defer f.Close()
// ادامهی کار با فایل...
}
🧠 چطوری کار میکنه؟
اگه چند تا defer پشتسرهم بنویسی، به صورت LIFO اجرا میشن؛ یعنی آخری اول اجرا میشه.
defer fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")
خروجی:
C
B
A
⚠️ نکتهی مهم
تو لوپهایی که زیاد تکرار میشن، زیاد از defer استفاده نکن، چون ممکنه کارایی بیاد پایین. بهجاش مستقیم اون تابع رو همون موقع صدا بزن.
🧹 جمعبندی
defer ابزار تمیزکاری تو Go هست. کمک میکنه کدت مرتب، ایمن و بدون نشتی منابع باشه. مخصوصا تو پروژههای واقعی خیلی کاربردیه!
اگه تجربه کار با defer داری، تو کامنتا بنویس 👇🏻
#golang #defer
☕️Telegram | Website | Discord
🔥8⚡2
🧵 شیگرایی بدون کلاس؟ Go یه راه باحالتر داره!
تو خیلی از زبانها مثل Java یا Python، وقتی حرف از شیگرایی میشه، فوراً میری سراغ کلاس و وراثت. ولی Go میگه: «بیخیال کلاس و دردسرهاش، یه راه سادهتر و قدرتمندتر داریم» 😎
📌 اینجاست که interface و implementation وارد میشن! 🎯
🔧حالا Interface چیه؟
خوب، Interface تو Go یعنی یه مجموعه از متدهایی که یه نوع (type) باید پیادهسازیشون کنه. بدون این که لازم باشه صریحاً بگی این struct، این interface رو implement میکنه!
مثلاً:
هر تایپی که متد ()Speak رو داشته باشه، خودش بهطور خودکار یه Speaker حساب میشه! 🤯
🧱حالا Implementation یعنی چی؟
پیاده سازی یا Implementation یعنی یه struct بسازی و متدهایی که interface لازم داره رو روش پیاده کنی.
خب، حالا چون Human متد ()Speak رو داره، خودشبهخود یه Speaker هم هست. لازم نیست هیچ جا بنویسی implements Speaker — Go خودش میفهمه! 🔍
💡 چرا این بهتر از کلاس و وراثته؟
✅ ترکیب بهجای وراثت: تو Go میتونی چند تا behavior رو ترکیب کنی، بدون این که مجبور شی از یه کلاس دیگه ارث ببری.
✅ ساده و شفاف: خبری از heirarchy و درختهای پیچیدهی کلاس نیست.
✅ انعطافپذیر: هر struct میتونه چندین interface رو همزمان satisfy کنه.
🛠 استفادهی واقعی
حالا میتونی هر چیزی که متد ()Speak داره، به این تابع بدی:
حتی structهای دیگه:
🔄 Interface خالی: interface{}
اگه نمیدونی طرف چی میفرسته، میتونی از interface خالی استفاده کنی:
ولی حواست باشه این قدرت زیاد میتونه باعث تاریکی بشه! ☠️
🧪 حالا Dependency Injection با Interface چطوریه؟
یه فایدهی خفن دیگه: تستنویسی راحتتر میشه! چون میتونی یه Mock بسازی که همون interface رو پیاده کنه. دیگه لازم نیست وابسته به یه struct خاص باشی.
تو تست، یه FakeDB میسازی و به جای دیتابیس واقعی میدی به کدت.
⚠️ نکات مهم
🚫 گو وراثت نداره. بهجاش composition و interface استفاده کن.
🧩 فقط وقتی interface بساز که واقعاً لازم باشه. زیاد کردن interfaceهای الکی، کد رو پیچیده میکنه.
🔄 ساختارها (struct) بهطور خودکار میتونن interfaceها رو satisfy کنن، فقط کافیه متد درست رو داشته باشن.
#golang
☕️Telegram | Website | Discord
تو خیلی از زبانها مثل Java یا Python، وقتی حرف از شیگرایی میشه، فوراً میری سراغ کلاس و وراثت. ولی Go میگه: «بیخیال کلاس و دردسرهاش، یه راه سادهتر و قدرتمندتر داریم» 😎
📌 اینجاست که interface و implementation وارد میشن! 🎯
🔧حالا Interface چیه؟
خوب، Interface تو Go یعنی یه مجموعه از متدهایی که یه نوع (type) باید پیادهسازیشون کنه. بدون این که لازم باشه صریحاً بگی این struct، این interface رو implement میکنه!
مثلاً:
type Speaker interface {
Speak() string
}
هر تایپی که متد ()Speak رو داشته باشه، خودش بهطور خودکار یه Speaker حساب میشه! 🤯
🧱حالا Implementation یعنی چی؟
پیاده سازی یا Implementation یعنی یه struct بسازی و متدهایی که interface لازم داره رو روش پیاده کنی.
type Human struct {}
func (h Human) Speak() string {
return "سلام! من انسانم"
}
خب، حالا چون Human متد ()Speak رو داره، خودشبهخود یه Speaker هم هست. لازم نیست هیچ جا بنویسی implements Speaker — Go خودش میفهمه! 🔍
💡 چرا این بهتر از کلاس و وراثته؟
✅ ترکیب بهجای وراثت: تو Go میتونی چند تا behavior رو ترکیب کنی، بدون این که مجبور شی از یه کلاس دیگه ارث ببری.
✅ ساده و شفاف: خبری از heirarchy و درختهای پیچیدهی کلاس نیست.
✅ انعطافپذیر: هر struct میتونه چندین interface رو همزمان satisfy کنه.
🛠 استفادهی واقعی
func SaySomething(s Speaker) {
fmt.Println(s.Speak())
}
حالا میتونی هر چیزی که متد ()Speak داره، به این تابع بدی:
SaySomething(Human{})
حتی structهای دیگه:
type Robot struct {}
func (r Robot) Speak() string {
return "010010 سلام"
}
SaySomething(Robot{})
🔄 Interface خالی: interface{}
اگه نمیدونی طرف چی میفرسته، میتونی از interface خالی استفاده کنی:
func PrintAnything(v interface{}) {
fmt.Println(v)
}
ولی حواست باشه این قدرت زیاد میتونه باعث تاریکی بشه! ☠️
🧪 حالا Dependency Injection با Interface چطوریه؟
یه فایدهی خفن دیگه: تستنویسی راحتتر میشه! چون میتونی یه Mock بسازی که همون interface رو پیاده کنه. دیگه لازم نیست وابسته به یه struct خاص باشی.
type DB interface {
Save(data string) error
}
تو تست، یه FakeDB میسازی و به جای دیتابیس واقعی میدی به کدت.
⚠️ نکات مهم
🚫 گو وراثت نداره. بهجاش composition و interface استفاده کن.
🧩 فقط وقتی interface بساز که واقعاً لازم باشه. زیاد کردن interfaceهای الکی، کد رو پیچیده میکنه.
🔄 ساختارها (struct) بهطور خودکار میتونن interfaceها رو satisfy کنن، فقط کافیه متد درست رو داشته باشن.
#golang
☕️Telegram | Website | Discord
❤🔥3🔥3⚡2
🧵 ساختار پروژه تو Go — نظم بدون دردسر 😎
وقتی یه پروژه کوچیک Go مینویسی، همهچی تو یه فایل جا میشه و دنیا قشنگه.
ولی وقتی یهکم رشد میکنه و چند تا پکیج و سرویس میچسبونیش بهش، کمکم حس میکنی داری تو آمازون گم میشی!
اینجاست که یه ساختار تمیز میتونه نجاتت بده.
گو میگه: «نه کلاس، نه فریمورک سنگین — فقط یه ساختار ساده ولی اصولی!»
🏗 ساختار پیشنهادی برای یه پروژهی واقعی Go:
🚀مسیر cmd/ — نقطهی شروع ماجرا
اینجا فایلهای main.go میره.
ممکنه چند تا اپلیکیشن داشته باشی (مثلاً یه سرور و یه worker):
📌 تو این پوشه فقط باید فایلهایی باشن که برنامه رو راه میندازن، نه منطق اصلی.
🧠مسیر internal/ — جعبهابزار محرمانه
گو یه قابلیت جالب داره: هر چی توی internal/ باشه، فقط از داخل خود پروژه قابل import کردنه.
یعنی مثل اینه که روش قفل زدی 🔒
اینجا معمولاً چیزهایی مثل:
logic اصلی برنامه
لایهی دسترسی به دیتابیس
implementation سرویسها
قرار میگیرن.
📦مسیر pkg/ — ابزارهای قابل استفاده بیرونی
اگه یه بخش از کدت خیلی جنرال و قابل reuseه، میتونی بندازیش تو pkg/.
مثلاً یه logger، یه پکیج محاسباتی، یا ابزار auth.
🛰مسیر api/ — قراردادهای ارتباطی
این پوشه جای تعریف APIهاست. مثلاً:
فایلهای .proto برای gRPC
تعریفهای OpenAPI یا Swagger
JSON schema
⚙️ مسیر configs/ — تنظیمات محیط
هر محیط یه سری تنظیم داره. dev، staging، production.
این فایلها میتونن yaml، json یا env باشن.
🛠مسیر scripts/ — ابزارهای پشتپرده
هر کاری که میخوای اتومات یا دستی انجام بدی، مثل:
✅ اجرای migration
✅بیلد(build) کردن
✅ اجرای تستها
✅پاک سازی (cleanup)
🧪مسیر test/ — تستهای جدیتر
واسه integration یا end-to-end testهایی که بزرگتر از unit test معمولین، این پوشه خیلی بهدرد میخوره.
📌 تو Go معمولا unit testها کنار خود کدها هستن (something_test.go)
ولی تستهای سیستمی رو بهتره اینجا نگهداری.
🧼 چند نکتهی طلایی
✅ ساختار پروژه هم باید همینطور باشه: شفاف، بدون پیچیدگی الکی.
✅ از همون اول نیازی نیست همهی پوشهها رو بسازی. ساختار با رشد پروژه شکل میگیره.
✅ چیزی که قرار نیست بیرون استفاده بشه، بندازش تو internal/ و راحت بخواب!
✅ هر چی ماژولارتر، بهتر: تفکیک مسئولیت باعث میشه تیم راحتتر توسعه بده، تست کنه، و تغییر بده.
حالا یه ابزار میخوام بهت معرفی کنم که این کارو برات اتوماتیک انجام میده.
https://github.com/Melkeydev/go-blueprint
#golang #project #structure
☕️Telegram | Website | Discord
وقتی یه پروژه کوچیک Go مینویسی، همهچی تو یه فایل جا میشه و دنیا قشنگه.
ولی وقتی یهکم رشد میکنه و چند تا پکیج و سرویس میچسبونیش بهش، کمکم حس میکنی داری تو آمازون گم میشی!
اینجاست که یه ساختار تمیز میتونه نجاتت بده.
گو میگه: «نه کلاس، نه فریمورک سنگین — فقط یه ساختار ساده ولی اصولی!»
🏗 ساختار پیشنهادی برای یه پروژهی واقعی Go:
myapp/
├── cmd/ → نقطهی ورود اپلیکیشن
├── internal/ → منطق داخلی، مخصوص خود پروژه
├── pkg/ → پکیجهای قابل استفاده عمومی
├── api/ → تعریف API (مثلاً protobuf یا Swagger)
├── configs/ → فایلهای پیکربندی
├── scripts/ → ابزارهای dev و deploy
├── test/ → تستهای integration
├── go.mod
└── README.md
🚀مسیر cmd/ — نقطهی شروع ماجرا
اینجا فایلهای main.go میره.
ممکنه چند تا اپلیکیشن داشته باشی (مثلاً یه سرور و یه worker):
cmd/
├── server/
│ └── main.go
├── worker/
│ └── main.go
📌 تو این پوشه فقط باید فایلهایی باشن که برنامه رو راه میندازن، نه منطق اصلی.
🧠مسیر internal/ — جعبهابزار محرمانه
گو یه قابلیت جالب داره: هر چی توی internal/ باشه، فقط از داخل خود پروژه قابل import کردنه.
یعنی مثل اینه که روش قفل زدی 🔒
اینجا معمولاً چیزهایی مثل:
logic اصلی برنامه
لایهی دسترسی به دیتابیس
implementation سرویسها
قرار میگیرن.
📦مسیر pkg/ — ابزارهای قابل استفاده بیرونی
اگه یه بخش از کدت خیلی جنرال و قابل reuseه، میتونی بندازیش تو pkg/.
مثلاً یه logger، یه پکیج محاسباتی، یا ابزار auth.
pkg/
└── logger/
└── logger.go
🛰مسیر api/ — قراردادهای ارتباطی
این پوشه جای تعریف APIهاست. مثلاً:
فایلهای .proto برای gRPC
تعریفهای OpenAPI یا Swagger
JSON schema
⚙️ مسیر configs/ — تنظیمات محیط
هر محیط یه سری تنظیم داره. dev، staging، production.
این فایلها میتونن yaml، json یا env باشن.
🛠مسیر scripts/ — ابزارهای پشتپرده
هر کاری که میخوای اتومات یا دستی انجام بدی، مثل:
✅ اجرای migration
✅بیلد(build) کردن
✅ اجرای تستها
✅پاک سازی (cleanup)
🧪مسیر test/ — تستهای جدیتر
واسه integration یا end-to-end testهایی که بزرگتر از unit test معمولین، این پوشه خیلی بهدرد میخوره.
📌 تو Go معمولا unit testها کنار خود کدها هستن (something_test.go)
ولی تستهای سیستمی رو بهتره اینجا نگهداری.
🧼 چند نکتهی طلایی
✅ ساختار پروژه هم باید همینطور باشه: شفاف، بدون پیچیدگی الکی.
✅ از همون اول نیازی نیست همهی پوشهها رو بسازی. ساختار با رشد پروژه شکل میگیره.
✅ چیزی که قرار نیست بیرون استفاده بشه، بندازش تو internal/ و راحت بخواب!
✅ هر چی ماژولارتر، بهتر: تفکیک مسئولیت باعث میشه تیم راحتتر توسعه بده، تست کنه، و تغییر بده.
حالا یه ابزار میخوام بهت معرفی کنم که این کارو برات اتوماتیک انجام میده.
https://github.com/Melkeydev/go-blueprint
#golang #project #structure
☕️Telegram | Website | Discord
🔥12⚡2
📚 2 تا کتاب رایگان برای علاقمندان به زبان های Rust و Golang
1. کتاب The Rust Programming Language
کتاب رسمی و جامع برای یادگیری زبان Rust از پایه تا پیشرفته. توضیحات شفاف، مثالهای کاربردی و پروژه های کوچک در طول مسیر یادگیری ارائه شده.
🔗 https://doc.rust-lang.org/book/
2. کتاب Practical Go Lessons
کتابی بیش از 200صفحه برای یادگیری زبان Go که از مفاهیم مقدماتی تا مباحث پیشرفته مثل مدیریت خطا، concurrency، تست نویسی و الگوهای طراحی رو پوشش میده.
🔗 https://practical-go-lessons.com/
#book #programming #rust #golang
☕️Telegram | Website | Discord
1. کتاب The Rust Programming Language
کتاب رسمی و جامع برای یادگیری زبان Rust از پایه تا پیشرفته. توضیحات شفاف، مثالهای کاربردی و پروژه های کوچک در طول مسیر یادگیری ارائه شده.
🔗 https://doc.rust-lang.org/book/
2. کتاب Practical Go Lessons
کتابی بیش از 200صفحه برای یادگیری زبان Go که از مفاهیم مقدماتی تا مباحث پیشرفته مثل مدیریت خطا، concurrency، تست نویسی و الگوهای طراحی رو پوشش میده.
🔗 https://practical-go-lessons.com/
#book #programming #rust #golang
☕️Telegram | Website | Discord
❤🔥6⚡5💔2😁1😍1