Go API के लिए आदर्श भाषा क्यों है?
\n\nजब उच्च-लोड वाले API बनाने की बात आती है, तो Go (Golang) शीर्ष स्थान पर मजबूती से बना हुआ है। इसकी कंपाइल की गई प्रकृति, गोरूटीन के माध्यम से अंतर्निहित समवर्ती समर्थन और न्यूनतम सिंटैक्स आपको तेज़ और विश्वसनीय माइक्रोसर्विसेज लिखने की अनुमति देते हैं। लेकिन आपके अगले प्रोजेक्ट के लिए कौन सा प्रोटोकॉल चुनें: क्लासिक REST, लचीला GraphQL या अति-तेज़ gRPC?
\n\nइस लेख में, हम केवल अंतरों को सूचीबद्ध नहीं करेंगे — हम प्रत्येक दृष्टिकोण के लिए Go में वास्तविक कोड लिखेंगे, बेंचमार्क का विश्लेषण करेंगे और चयन के लिए स्पष्ट मानदंड देंगे। चलिए शुरू करते हैं!
\n\nGo पर REST API: सिद्ध क्लासिक
\n\nREST (Representational State Transfer) सार्वजनिक API के लिए डी-फैक्टो मानक बना हुआ है। Go उत्कृष्ट मानक लाइब्रेरी net/http प्रदान करता है, साथ ही gin और echo जैसे लोकप्रिय फ्रेमवर्क भी प्रदान करता है।
शुद्ध Go पर REST सर्वर का उदाहरण
\n\nआइए कार्यों के प्रबंधन के लिए एक सरल CRUD सेवा से शुरू करें। बिना किसी तीसरे पक्ष की निर्भरता के Go पर न्यूनतम REST API इस प्रकार दिखता है:
\n\npackage main\n\nimport (\n "encoding/json"\n "log"\n "net/http"\n "sync"\n)\n\ntype Task struct {\n ID int `json:"id"`\n Name string `json:"name"`\n}\n\nvar (\n tasks = []Task{{ID: 1, Name: "Go सीखें"}}\n mu sync.Mutex\n nextID = 2\n)\n\nfunc getTasks(w http.ResponseWriter, r *http.Request) {\n mu.Lock()\n defer mu.Unlock()\n w.Header().Set("Content-Type", "application/json")\n json.NewEncoder(w).Encode(tasks)\n}\n\nfunc createTask(w http.ResponseWriter, r *http.Request) {\n var task Task\n if err := json.NewDecoder(r.Body).Decode(&task); err != nil {\n http.Error(w, err.Error(), http.StatusBadRequest)\n return\n }\n mu.Lock()\n task.ID = nextID\n nextID++\n tasks = append(tasks, task)\n mu.Unlock()\n w.WriteHeader(http.StatusCreated)\n json.NewEncoder(w).Encode(task)\n}\n\nfunc main() {\n http.HandleFunc("/tasks", func(w http.ResponseWriter, r *http.Request) {\n switch r.Method {\n case http.MethodGet:\n getTasks(w, r)\n case http.MethodPost:\n createTask(w, r)\n default:\n http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)\n }\n })\n log.Println("REST API :8080 पर शुरू हुआ")\n log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\n\nGo पर REST के लाभ:
\n- \n
- सरलता और पूर्वानुमेयता — प्रत्येक एंडपॉइंट एक निश्चित डेटा संरचना लौटाता है \n
- HTTP हेडर के माध्यम से उत्कृष्ट कैशिंग क्षमता \n
- उपकरणों की व्यापक समर्थन (Swagger, Postman) \n
नुकसान: डेटा का ओवर-फ़ेचिंग और अंडर-फ़ेचिंग। यदि क्लाइंट को केवल कार्य का नाम चाहिए, तब भी उसे पूरा JSON मिलेगा।
\n\nGo पर GraphQL: क्वेरी में लचीलापन
\n\nGraphQL डेटा अतिरेक की समस्या को हल करता है। क्लाइंट स्वयं तय करता है कि उसे कौन से फ़ील्ड चाहिए। Go समुदाय शक्तिशाली लाइब्रेरी gqlgen प्रदान करता है, जो स्कीमा से कोड उत्पन्न करती है।
gqlgen के साथ GraphQL सर्वर का उदाहरण
\n\nपहले स्कीमा schema.graphql परिभाषित करें:
type Task {\n id: ID!\n name: String!\n}\n\ntype Query {\n tasks: [Task!]!\n}\n\ntype Mutation {\n createTask(name: String!): Task!\n}\n\n\nअब जनरेशन चलाएं और Go पर रिज़ॉल्वर लिखें:
\n\npackage main\n\nimport (\n "log"\n "net/http"\n "github.com/99designs/gqlgen/graphql/handler"\n "github.com/99designs/gqlgen/graphql/playground"\n)\n\n// मान लें कि जनरेटेड कोड पहले से मौजूद है\ntype Resolver struct {\n tasks []Task\n mu sync.Mutex\n}\n\nfunc (r *Resolver) Tasks(ctx context.Context) ([]Task, error) {\n r.mu.Lock()\n defer r.mu.Unlock()\n return r.tasks, nil\n}\n\nfunc (r *Resolver) CreateTask(ctx context.Context, name string) (*Task, error) {\n r.mu.Lock()\n defer r.mu.Unlock()\n