زبان Go به دلیل سادگی، سرعت و کتابخانههای داخلی قدرتمند، یکی از گزینههای محبوب برای ساخت وبسرویسها و APIهای مقیاسپذیر است. در این بخش، با اصول اولیه ساخت وباپلیکیشن در Go آشنا میشویم؛ از سرویسدهی ساده با net/http گرفته تا استفاده از فریمورکهایی مثل Gin، اتصال به دیتابیس و پیادهسازی احراز هویت با JWT.
net/httpکتابخانه استاندارد net/http در Go ابزار اصلی برای ساخت وبسرورهاست. میتونید خیلی سریع یه سرور ساده راهاندازی کنید:
import ("fmt""net/http")func handler(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "سلام دنیا!")}func main() {http.HandleFunc("/", handler)http.ListenAndServe(":8080", nil)}
در اینجا، هر بار که کاربر آدرس / رو باز میکنه، تابع handler اجرا میشه و متن "سلام دنیا!" رو نمایش میده.
برای ساخت یک API، میتونید مسیرها (Routeها) رو تعریف کرده و پاسخهایی با فرمت JSON ارسال کنید:
func apiHandler(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "application/json")w.Write([]byte(`{"message": "این یک API ساده است"}`))}func main() {http.HandleFunc("/api", apiHandler)http.ListenAndServe(":8080", nil)}
اگر از فریمورک استفاده نکنید، میتونید Routing رو دستی مدیریت کنید:
func main() {http.HandleFunc("/home", homeHandler)http.HandleFunc("/about", aboutHandler)http.ListenAndServe(":8080", nil)}
و برای پیادهسازی Middleware ساده مثلاً جهت بررسی لاگین یا ثبت لاگ، میتونید توابعی بنویسید که قبل از اجرای handler اجرا بشن:
func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {fmt.Println("درخواست جدید:", r.URL.Path)next(w, r)}}
اگر دنبال ساخت پروژههای بزرگتر هستی، استفاده از فریمورکهایی مثل Gin یا Echo پیشنهاد میشه.
مثال ساده با Gin:
import "github.com/gin-gonic/gin"func main() {r := gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200, gin.H{"message": "pong"})})r.Run(":8080")}
این کد یه API ساده روی مسیر /ping ایجاد میکنه که جواب "pong" میده.
اتصال به PostgreSQL با GORM:
import ("gorm.io/driver/postgres""gorm.io/gorm")func connectDB() *gorm.DB {dsn := "host=localhost user=test password=1234 dbname=testdb port=5432 sslmode=disable"db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})if err != nil {panic("خطا در اتصال به دیتابیس")}return db}
با GORM میتونید خیلی راحت ساختارهای struct رو به جدولهای دیتابیس وصل کنید و عملیات CRUD انجام بدید.
برای محافظت از APIها، میتونید از توکن JWT استفاده کنید. بعد از لاگین موفق، سرور یک توکن به کاربر میده و کاربر در درخواستهای بعدی این توکن رو میفرسته.
مراحل کلی:
نصب پکیج github.com/golang-jwt/jwt/v5
تولید توکن:
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{"user_id": 123,"exp": time.Now().Add(time.Hour * 72).Unix(),})tokenString, _ := token.SignedString([]byte("رمز_سری"))
بررسی توکن در درخواستهای بعدی (از طریق Header):
token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {return []byte("رمز_سری"), nil})
با این ابزارها و مفاهیم، میتونید یه وباپلیکیشن کامل با زبان Go بسازید، به دیتابیس وصل بشید، APIهای امن پیادهسازی کنید و اپلیکیشنی سریع و مقیاسپذیر بسازید.