WebAssembly और Go के साथ कार्य: उन्नत स्तर
\n\nWebAssembly (WASM) वेब विकास के लिए नए क्षितिज खोलता है, जिससे JavaScript के अलावा अन्य भाषाओं में लिखे उच्च-प्रदर्शन कोड को निष्पादित किया जा सकता है। Go (Golang) अपने WASM कंपाइलर और सरल समवर्ती मॉडल के साथ जटिल वेब मॉड्यूल बनाने के लिए एक उत्कृष्ट उम्मीदवार है। इस लेख में, हम Go और WebAssembly एकीकरण की उन्नत तकनीकों पर विचार करेंगे: मेमोरी के साथ कार्य, जटिल डेटा संरचनाओं का स्थानांतरण, JavaScript के साथ द्विदिश संचार और प्रदर्शन अनुकूलन।
\n\n1. Go और JavaScript के बीच जटिल डेटा संरचनाओं का स्थानांतरण
\n\nsyscall/js के माध्यम से संख्याओं और स्ट्रिंग्स का मूल स्थानांतरण सरल है, लेकिन वास्तविक अनुप्रयोगों के लिए यह पर्याप्त नहीं है। उन्नत दृष्टिकोण में जटिल संरचनाओं (स्लाइस, मैप, उपयोगकर्ता-परिभाषित प्रकार) को JSON या बाइनरी प्रारूप में क्रमबद्ध करना शामिल है।
JSON के माध्यम से क्रमबद्धीकरण
\nसबसे सरल और सार्वभौमिक विधि encoding/json का उपयोग करना है। आप एक फ़ंक्शन निर्यात करते हैं जो JSON-स्ट्रिंग प्राप्त करता है, इसे Go संरचना में डी-सीरियलाइज़ करता है, प्रक्रिया करता है और परिणाम को वापस JSON के रूप में लौटाता है।
// main.go\npackage main\n\nimport (\n "encoding/json"\n "syscall/js"\n)\n\ntype InputData struct {\n Name string `json:"name"`\n Value float64 `json:"value"`\n}\n\ntype OutputData struct {\n Greeting string `json:"greeting"`\n Square float64 `json:"square"`\n}\n\nfunc processData(this js.Value, args []js.Value) interface{} {\n if len(args) < 1 {\n return "Error: expected JSON string"\n }\n inputJSON := args[0].String()\n\n var input InputData\n if err := json.Unmarshal([]byte(inputJSON), &input); err != nil {\n return "Error: " + err.Error()\n }\n\n output := OutputData{\n Greeting: "Hello, " + input.Name,\n Square: input.Value * input.Value,\n }\n\n resultJSON, _ := json.Marshal(output)\n return string(resultJSON)\n}\n\nfunc main() {\n c := make(chan struct{}, 0)\n js.Global().Set("processData", js.FuncOf(processData))\n <-c\n}\n\nमेमोरी के साथ सीधा कार्य (बाइनरी प्रोटोकॉल)
\nअधिकतम प्रदर्शन के लिए, आप WASM की रैखिक मेमोरी के माध्यम से डेटा स्थानांतरित कर सकते हैं। आप मेमोरी में लिखने/पढ़ने के लिए फ़ंक्शन निर्यात करते हैं और JavaScript को पॉइंटर्स (पूर्णांक के रूप में) पास करते हैं। यह विधि अधिक जटिल है, लेकिन JSON पार्सिंग के ओवरहेड से बचाती है।
\n\n// मेमोरी में लिखने के लिए फ़ंक्शन निर्यात करना\n//go:wasmexport allocateMemory\nfunc allocateMemory(size int) uintptr {\n // C.malloc या अपने स्वयं के आवंटक का उपयोग करें\n // पॉइंटर लौटाएं\n}\n\n//go:wasmexport getMemoryBuffer\nfunc getMemoryBuffer() uintptr {\n // बफर की शुरुआत लौटाएं\n}\n\nJavaScript में, आप प्राप्त पतों पर पढ़ने/लिखने के लिए WebAssembly.Memory और Uint8Array का उपयोग करते हैं।
2. Go से JavaScript को कॉल करना और DOM प्रबंधन
\n\nsyscall/js पैकेज आपको किसी भी JavaScript फ़ंक्शन को कॉल करने और DOM में हेरफेर करने की अनुमति देता है। उन्नत स्तर में प्रतिक्रियाशील इंटरफ़ेस बनाना और ईवेंट को संभालना शामिल है।
DOM तत्वों का निर्माण और अद्यतन
\nfunc appendDiv(this js.Value, args []js.Value) interface{} {\n document := js.Global().Get("document")\n body := document.Get("body")\n\n newDiv := document.Call("createElement", "div")\n newDiv.Set("innerHTML", "<h2>Hello from Go WASM!</h2>")\n newDiv.Get("style").Set("color", "blue")\n body.Call("appendChild", newDiv)\n return nil\n}\n\nfunc main() {\n js.Global().Set("appendDiv", js.FuncOf(appendDiv))\n select {}\n}\n\nGo पक्ष पर ईवेंट हैंडलिंग
\nfunc setupClickHandler(this js.Value, args []js.Value) interface{} {\n document := js.Global().Get("document")\n button := document.Call("getElementById", "myButton")\n\n clickCallback := js.FuncOf(func(this js.Value, args []js