Goসাথেজিন ফ্রেমওয়ার্ক হল 2026-এ REST API তৈরির দ্রুততম, পরিচ্ছন্ন উপায়গুলির মধ্যে একটি — সংকলিত কর্মক্ষমতা, সাধারণ সিনট্যাক্স এবং একটি পরিপক্ক ইকোসিস্টেম। এই গাইডটি রাউটিং, বৈধতা, ডাটাবেস অ্যাক্সেস এবং মিডলওয়্যার সহ একটি সম্পূর্ণ API তৈরি করে।
📋 Table of Contents
- কেন যান এবং জিন?
- বেসিক সার্ভার এবং রাউটিং
- মডেল এবং ডেটাবেস
- JSON বাঁধাই এবং বৈধতা সহ হ্যান্ডলাররা
- কাস্টম মিডলওয়্যার
- স্ট্রাকচার্ড এরর হ্যান্ডলিং
- করুণাময় শাটডাউন
- প্রায়শই জিজ্ঞাসিত প্রশ্ন
- প্রশ্ন: জিন বনাম ইকো বনাম ফাইবার?
- Go with Gin দ্রুত, পরিষ্কার REST API সরবরাহ করে যা একটি একক স্থাপনযোগ্য বাইনারিতে কম্পাইল করে। এই নির্দেশিকাটি প্রয়োজনীয় বিষয়গুলি কভার করে — রুট গ্রুপ, বৈধকরণের সাথে JSON বাইন্ডিং, GORM ডাটাবেস অ্যাক্সেস, অনুমোদনের জন্য কাস্টম মিডলওয়্যার, কাঠামোগত ত্রুটি এবং আকর্ষণীয় শাটডাউন। Go-এর পারফরম্যান্স এবং সাধারণ স্থাপনা এটিকে মাইক্রোসার্ভিসেস এবং উচ্চ-সঙ্গতি API-এর জন্য চমৎকার করে তোলে। উৎপাদনের আগে রেট লিমিটিং, স্ট্রাকচার্ড লগিং এবং OpenAPI ডক্স যোগ করুন এবং আপনার কাছে একটি শক্তিশালী, মাপযোগ্য ব্যাকএন্ড আছে।
কেন যান এবং জিন?
- কর্মক্ষমতা: কম্পাইলড গো ন্যূনতম সংস্থানগুলির সাথে উচ্চ সঙ্গতি পরিচালনা করে
- সরল স্থাপনা: একটি একক স্ট্যাটিক বাইনারি — ইনস্টল করার জন্য কোনো রানটাইম নেই
- জিনের গতিঃ একটি পরিষ্কার API সহ দ্রুততম গো ওয়েব ফ্রেমওয়ার্কগুলির মধ্যে একটি মাইক্রোসার্ভিসের জন্য দুর্দান্ত:
- ছোট বাইনারি, দ্রুত স্টার্টআপ, কম মেমরিসেটআপ
বেসিক সার্ভার এবং রাউটিং
mkdir go-api && cd go-api
go mod init github.com/you/go-api
go get github.com/gin-gonic/gin
go get gorm.io/gorm gorm.io/driver/postgres
মডেল এবং ডেটাবেস
// main.go
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default() // includes logger and recovery middleware
r.GET("/health", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "ok"})
})
// Route groups
api := r.Group("/api/v1")
{
api.GET("/users", getUsers)
api.GET("/users/:id", getUser)
api.POST("/users", createUser)
api.PUT("/users/:id", updateUser)
api.DELETE("/users/:id", deleteUser)
}
r.Run(":8080")
}
JSON বাঁধাই এবং বৈধতা সহ হ্যান্ডলাররা
// models.go
package main
import "gorm.io/gorm"
type User struct {
ID uint `json:"id" gorm:"primaryKey"`
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email" gorm:"unique"`
}
var db *gorm.DB
func initDB() {
dsn := "host=localhost user=postgres password=pass dbname=mydb port=5432"
var err error
db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
db.AutoMigrate(&User{})
}
কাস্টম মিডলওয়্যার
// handlers.go
func getUsers(c *gin.Context) {
var users []User
db.Find(&users)
c.JSON(http.StatusOK, users)
}
func getUser(c *gin.Context) {
var user User
if err := db.First(&user, c.Param("id")).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "user not found"})
return
}
c.JSON(http.StatusOK, user)
}
func createUser(c *gin.Context) {
var user User
// Binds JSON and runs validation tags (required, email)
if err := c.ShouldBindJSON(&user); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if err := db.Create(&user).Error; err != nil {
c.JSON(http.StatusConflict, gin.H{"error": "email already exists"})
return
}
c.JSON(http.StatusCreated, user)
}
স্ট্রাকচার্ড এরর হ্যান্ডলিং
// Authentication middleware
func authRequired() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "missing token"})
c.Abort() // stop the chain
return
}
userID, err := verifyToken(token)
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
c.Abort()
return
}
c.Set("userID", userID) // pass to handlers
c.Next()
}
}
// Apply to a route group
protected := r.Group("/api/v1")
protected.Use(authRequired())
করুণাময় শাটডাউন
// Consistent error responses
type APIError struct {
Code int `json:"code"`
Message string `json:"message"`
}
func respondError(c *gin.Context, code int, msg string) {
c.JSON(code, APIError{Code: code, Message: msg})
}
// Recovery middleware (Gin includes one, but you can customize)
r.Use(gin.CustomRecovery(func(c *gin.Context, recovered interface{}) {
respondError(c, http.StatusInternalServerError, "internal server error")
}))
প্রায়শই জিজ্ঞাসিত প্রশ্ন
func main() {
r := setupRouter()
srv := &http.Server{Addr: ":8080", Handler: r}
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
// Wait for interrupt signal
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
// Graceful shutdown with 5-second timeout
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)
}
প্রশ্ন: জিন বনাম ইকো বনাম ফাইবার?
উত্তর: সবাই দ্রুত এবং পরিপক্ক। জিন বৃহত্তম বাস্তুতন্ত্রের সাথে সবচেয়ে জনপ্রিয়। ইকো অনুরূপ। ফাইবার একটি এক্সপ্রেস মত API আছে. বেশিরভাগ প্রকল্পের জন্য, জিনের জনপ্রিয়তা এবং ডকুমেন্টেশন এটিকে নিরাপদ ডিফল্ট করে তোলে।
প্রশ্নঃ GORM নাকি raw SQL/sqlx?
উত্তর: GORM CRUD এবং দ্রুত বিকাশের জন্য সুবিধাজনক। জটিল প্রশ্ন বা সর্বাধিক নিয়ন্ত্রণ এবং কার্যকারিতার জন্য, sqlx বা pgx সহ কাঁচা SQL পছন্দ করা হয়। অনেক দল বেসিকের জন্য GORM ব্যবহার করে এবং যেখানে প্রয়োজন সেখানে কাঁচা SQL তে চলে যায়।
প্রশ্ন: আমি কীভাবে অনুরোধের ডেটা যাচাই করব?
উত্তর: জিন ভ্যালিডেটর লাইব্রেরির সাথে স্ট্রাকট ট্যাগ ব্যবহার করে —
স্বয়ংক্রিয়ভাবে বৈধতা চালায় এবং ত্রুটিগুলি ফেরত দেয় যা আপনি ক্লায়েন্টে ফিরে যেতে পারেন।binding:"required,email". ShouldBindJSONপ্রশ্ন: জিনে আমি কীভাবে CORS পরিচালনা করব?
উত্তর: gin-contrib/cors মিডলওয়্যার ব্যবহার করুন:
অনুমতিমূলক ডেভের জন্য, বা উৎপাদনের জন্য নির্দিষ্ট উত্স, পদ্ধতি এবং হেডার কনফিগার করুন।r.Use(cors.Default())প্রশ্ন: আমি কীভাবে জিন হ্যান্ডলারদের পরীক্ষা করব?
উত্তর: একটি পরীক্ষার অনুরোধ এবং রেকর্ডার তৈরি করতে httptest ব্যবহার করুন, তারপর প্রতিক্রিয়ার উপর জোর দিন। জিনের রাউটার পরিষ্কার, দ্রুত হ্যান্ডলার পরীক্ষার জন্য গো-এর স্ট্যান্ডার্ড টেস্টিং টুলের সাথে কাজ করে।
উপসংহার
Go with Gin দ্রুত, পরিষ্কার REST API সরবরাহ করে যা একটি একক স্থাপনযোগ্য বাইনারিতে কম্পাইল করে। এই নির্দেশিকাটি প্রয়োজনীয় বিষয়গুলি কভার করে — রুট গ্রুপ, বৈধকরণের সাথে JSON বাইন্ডিং, GORM ডাটাবেস অ্যাক্সেস, অনুমোদনের জন্য কাস্টম মিডলওয়্যার, কাঠামোগত ত্রুটি এবং আকর্ষণীয় শাটডাউন। Go-এর পারফরম্যান্স এবং সাধারণ স্থাপনা এটিকে মাইক্রোসার্ভিসেস এবং উচ্চ-সঙ্গতি API-এর জন্য চমৎকার করে তোলে। উৎপাদনের আগে রেট লিমিটিং, স্ট্রাকচার্ড লগিং এবং OpenAPI ডক্স যোগ করুন এবং আপনার কাছে একটি শক্তিশালী, মাপযোগ্য ব্যাকএন্ড আছে।
Go with Gin দ্রুত, পরিষ্কার REST API সরবরাহ করে যা একটি একক স্থাপনযোগ্য বাইনারিতে কম্পাইল করে। এই নির্দেশিকাটি প্রয়োজনীয় বিষয়গুলি কভার করে — রুট গ্রুপ, বৈধকরণের সাথে JSON বাইন্ডিং, GORM ডাটাবেস অ্যাক্সেস, অনুমোদনের জন্য কাস্টম মিডলওয়্যার, কাঠামোগত ত্রুটি এবং আকর্ষণীয় শাটডাউন। Go-এর পারফরম্যান্স এবং সাধারণ স্থাপনা এটিকে মাইক্রোসার্ভিসেস এবং উচ্চ-সঙ্গতি API-এর জন্য চমৎকার করে তোলে। উৎপাদনের আগে রেট লিমিটিং, স্ট্রাকচার্ড লগিং এবং OpenAPI ডক্স যোগ করুন এবং আপনার কাছে একটি শক্তিশালী, মাপযোগ্য ব্যাকএন্ড আছে।
🔗 Share this article
✍️ Leave a Comment