Skip to content

Latest commit

 

History

History
210 lines (154 loc) · 12.2 KB

File metadata and controls

210 lines (154 loc) · 12.2 KB

خلاصه دوره: Golang Web Development: Create Powerful Servers with Golang

این داکیومنت خلاصه نکات اصلی دوره است. اگه فرصت داری، دیدن کامل خود دوره خیلی توصیه می‌شه.

AI-Powered buttons

Teach Me: 5 Years Old | Beginner | Intermediate | Advanced | (reset auto redirect)

Learn Differently: Analogy | Storytelling | Cheatsheet | Mindmap | Flashcards | Practical Projects | Code Examples | Common Mistakes

Check Understanding: Generate Quiz | Interview Me | Refactor Challenge | Assessment Rubric | Next Steps

؜۱. معرفی دوره و چرا Go برای Web Development

راجان اول دوره توضیح می‌ده چرا خیلی از شرکت‌های بزرگ دارن می‌رن سمت Go: سریع و کم‌مصرفه، و برای ساخت سرویس‌های backend مقیاس‌پذیر عالیه. یک نقشه راه کلی هم می‌ده: از یک سرور خیلی ساده با Go شروع می‌کنی، بعد می‌ری سراغ Gin برای routing بهتر، از Docker + PostgreSQL استفاده می‌کنی، یک سری CRUD API کامل می‌سازی، Google OAuth + JWT Auth اضافه می‌کنی و در نهایت همه‌چیز رو با در نظر گرفتن CI/CD روی AWS دیپلوی می‌کنی.

مثال: آخر دوره یک API مدیریت Task خواهی داشت که روی AWS ران می‌شه، با Google Login کاربر را لاگین می‌کنه و به یک دیتابیس واقعی روی Cloud وصل می‌شه.

Ask AI: Why Go for backend

؜۲. نصب Go و ساختن اولین سرور

یاد می‌گیری چطور Go (نسخه 1.23 به بالا) رو نصب کنی، ‎GOPATH رو تنظیم کنی و با استفاده از پکیج استاندارد net/http در حدود ۱۵ خط، یک سرور «hello world» خیلی ساده بسازی.

مثال:

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "OK")
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Ask AI: Installing Go and first server

؜۳. چرا Gin و مهاجرت به Gin Framework

راجان net/http خام رو با Gin مقایسه می‌کنه و نشون می‌ده چرا برای پروژه‌های واقعی Gin انتخاب بهتریه: لاگ‌گیری خودکار، ساخت JSON Response راحت، validation توکار، پشتیبانی از middleware، گروه‌بندی routeها و پرفورمنس بهتر.

مثال:

r := gin.Default()
r.GET("/", func(c *gin.Context) {
    c.JSON(200, gin.H{"message": "OK"})
})
r.Run(":8080")

Ask AI: Gin vs net/http

؜۴. Environment Variableها و مدیریت Config

هیچ‌وقت Secret‌هات رو hard-code نکن! اینجا با godotenv کار می‌کنی تا مقادیر رو از فایل .env بخونی و یک پکیج config تمیز بسازی که فقط یک‌بار موقع start شدن برنامه (مثلاً داخل init()) لود بشه.

مثال:

APP_PORT=8080
DB_PATH=postgres://postgres:adminpassword@localhost:5433/tasks?sslmode=disable

Ask AI: Environment variables in Go

؜۵. Docker + PostgreSQL Setup

می‌بینی چرا Docker برای دیتابیس لوکال خیلی ایده‌آله (نسخه‌های مختلف، پاک کردن ساده، ایزوله بودن و ...). راجان یک docker-compose.yml آماده می‌ده که PostgreSQL 16 رو بالا می‌آره و دیتابیس tasks رو برات می‌سازه.

مثال:

services:
  postgres:
    image: postgres:16.3
    container_name: postgres
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: adminpassword
      POSTGRES_DB: tasks
    ports:
      - "5433:5432"

Ask AI: Docker PostgreSQL for Go

؜۶. Live Reload با Air

دیگه لازم نیست بعد هر تغییری سرور رو دستی ریستارت کنی. air رو نصب می‌کنی و هر بار فایل رو Save کنی، سرور خودش ریستارت می‌شه.

مثال (دستور ترمینال):

air
# → Server بعد از هر ذخیره، خودکار ریستارت می‌شود

Ask AI: Live reload Go with Air

؜۷. CRUD – ساخت Task (POST، Validation و Migrationها)

؜Route مربوط به POST /tasks رو می‌سازی، از binding و tagهای Gin برای validation استفاده می‌کنی، با golang-migrate migration می‌نویسی و queryها رو در یک لایه repository جدا نگه می‌داری.

مثال validation:

type CreateTaskPayload struct {
    Title       string `json:"title" binding:"required,max=100"`
    Description string `json:"description" binding:"required,max=1000"`
}

Ask AI: CRUD Create and validation Gin

؜۸. Read، Update و Delete Taskها (GET، PATCH، DELETE)

باقی عملیات CRUD را هم کامل می‌کنی: گروه‌بندی routeها، استفاده از query parameterها، پیاده‌سازی PATCH برای آپدیت جزئی فیلدها و نوشتن متدهای تمیز در لایه repository.

مثال payload آپدیت:

type UpdateTaskPayload struct {
    ID          int    `json:"id" binding:"required"`
    Title       *string `json:"title" binding:"omitempty,max=100"`
    Description *string `json:"description" binding:"omitempty,max=1000"`
}

Ask AI: CRUD Read Update Delete Gin

؜۹. Google OAuth2 + JWT Authentication

یک پروژه تو Google Cloud می‌سازی، endpointهای /login/google و /callback/google رو پیاده می‌کنی، code رو با token عوض می‌کنی، اطلاعات کاربر رو می‌گیری و در نهایت یک JWT با انقضای ۲۴ ساعته برای کاربر sign می‌کنی.

مثال ساخت JWT:

token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "email": user.Email,
    "name":  user.Name,
    "exp":   time.Now().Add(time.Hour * 24).Unix(),
})
tokenString, _ := token.SignedString([]byte(config.JWT_SECRET))

Ask AI: Google OAuth JWT Go

؜۱۰. Middleware احراز هویت (محافظت از Routeها)

یک middleware قابل‌استفاده‌ی مجدد می‌نویسی که header مربوط به Authorization: Bearer <token> رو می‌خونه، JWT رو verify می‌کنه و اگر token نامعتبر یا منقضی باشه با status 403 درخواست رو رد می‌کنه.

مثال middleware:

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        tokenString := c.GetHeader("Authorization")
        if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
            c.AbortWithStatusJSON(403, gin.H{"error": "Unauthorized"})
            return
        }
        // ...parse and verify token
        c.Next()
    }
}

Ask AI: JWT middleware Gin

؜۱۱. دیپلویمنت – AWS Elastic Beanstalk + RDS

؜AWS CLI رو نصب می‌کنی، یک IAM User با سطح دسترسی محدود می‌سازی، با eb init و eb deploy اپلیکیشن رو روی Elastic Beanstalk دیپلوی می‌کنی، یک Procfile تعریف می‌کنی، به RDS PostgreSQL (داخل VPC خصوصی) وصل می‌شی و migrationها رو روی محیط Production اجرا می‌کنی.

مثال Procfile:

web: bin/application

Ask AI: Deploy Go to AWS Elastic Beanstalk RDS


؜درباره خلاصه‌کننده

من Ali Sol هستم، Backend Developer. برای آشنایی بیشتر: