Go एक द्वीप नहीं, बल्कि एक पुल क्यों है
\n\nGo एक शानदार भाषा है। यह तेज़, कंपाइल की जाने वाली और एक उत्कृष्ट मानक लाइब्रेरी वाली है। लेकिन आइए ईमानदार रहें: वास्तविक दुनिया में, हम शायद ही कभी एक ही भाषा में सब कुछ नए सिरे से लिखते हैं। आपके पास C में एक पुरानी, समय-परीक्षित लाइब्रेरी है जिसे फिर से लिखना अफ़सोस की बात होगी। या मशीन लर्निंग के लिए Python में एक बढ़िया स्क्रिप्ट है। या आप Go लॉजिक को सीधे ब्राउज़र में चलाना चाहते हैं।
\nऔर फिर सवाल उठता है: Go को अन्य भाषाओं के साथ कैसे एकीकृत करें? डरें नहीं, Go को विशेष रूप से एक अच्छा 'पड़ोसी' बनने के लिए डिज़ाइन किया गया था। PythonLib पर इस लेख में, हम आपके Go प्रोग्राम को दूसरे कोड के साथ जोड़ने के तीन मुख्य तरीकों पर चर्चा करेंगे। आप जानेंगे कि cgo कैसे काम करता है, सिस्टम कॉल के माध्यम से Python फ़ंक्शन को कैसे कॉल करें, और यहां तक कि Go को WebAssembly में कैसे कंपाइल करें।
cgo के माध्यम से Go का C के साथ एकीकरण: क्लासिक तरीका
\n\nसबसे सीधा और शक्तिशाली तरीका cgo है। यह कोई लाइब्रेरी नहीं है, बल्कि Go का एक अंतर्निहित तंत्र है जो आपके कोड को सीधे C फ़ंक्शन को कॉल करने की अनुमति देता है। यह कैसे काम करता है? आप बस "C" इम्पोर्ट करते हैं और उससे पहले C कोड के साथ एक टिप्पणी लिखते हैं। Go कंपाइलर सब कुछ जोड़ देगा।
cgo के साथ पहला प्रोग्राम लिखना
\n\nआइए एक सरल उदाहरण लिखें: C से मानक printf को कॉल करें। main.go फ़ाइल बनाएं:
package main\n\n/*\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid hello_cgo(const char* name) {\n printf("C से नमस्ते, %s!\\n", name);\n}\n*/\nimport "C"\nimport "unsafe"\n\nfunc main() {\n name := C.CString("Gopher")\n defer C.free(unsafe.Pointer(name))\n C.hello_cgo(name)\n}\n\n\nचलाएं: go run main.go। यदि आपके पास GCC (या Windows पर MinGW) स्थापित है, तो सब कुछ कंपाइल हो जाएगा। आप «C से नमस्ते, Gopher!» देखेंगे। जादू!
महत्वपूर्ण: C.CString C हीप में मेमोरी आवंटित करता है, इसलिए हमें इसे C.free के माध्यम से मुक्त करना होगा। अन्यथा - मेमोरी लीक। Cgo के लिए आपसे अनुशासन की आवश्यकता है।
जटिल प्रकारों को पास करना: स्ट्रक्चर
\n\nअक्सर स्ट्रिंग के बजाय स्ट्रक्चर के साथ काम करने की आवश्यकता होती है। मान लीजिए, हमारे पास मैट्रिक्स के साथ काम करने के लिए C लाइब्रेरी है। हम इसमें Go स्ट्रक्चर पास करना चाहते हैं। इसे इस तरह करें:
\n\npackage main\n\n/*\ntypedef struct {\n int x;\n int y;\n int result;\n} Point;\n\nPoint add_points(Point a, Point b) {\n Point r;\n r.x = a.x + b.x;\n r.y = a.y + b.y;\n r.result = r.x + r.y;\n return r;\n}\n*/\nimport "C"\nimport "fmt"\n\ntype GoPoint struct {\n X, Y, Result int\n}\n\nfunc main() {\n a := C.Point{x: 10, y: 20}\n b := C.Point{x: 30, y: 40}\n r := C.add_points(a, b)\n\n goPoint := GoPoint{\n X: int(r.x),\n Y: int(r.y),\n Result: int(r.result),\n }\n fmt.Printf("Go को मिला: Point{X:%d, Y:%d, Result:%d}\\n", goPoint.X, goPoint.Y, goPoint.Result)\n}\n\n\nध्यान दें: हम C प्रकारों को स्पष्ट रूप से Go प्रकारों में बदल रहे हैं। Cgo स्वचालित रूप से स्ट्रक्चर को मैप नहीं कर सकता, इसलिए आप हमेशा रूपांतरण के लिए जिम्मेदार हैं। यह Go का C भाषा के साथ एकीकरण के मुख्य समझौतों में से एक है।
\n\ncgo की आवश्यकता कब नहीं है
\ncgo का उपयोग न करें यदि:
\n- \n
- आपको बस टर्मिनल में एक कमांड चलाने की आवश्यकता है -
os/execका उपयोग करें। \n - आप क्रॉस-प्लेटफ़ॉर्म कोड लिख रहे हैं - cgo बिल्ड को जटिल बनाता है। \n
- प्रदर्शन महत्वपूर्ण नहीं है - cgo संदर्भ स्विचिंग पर ओवरहेड जोड़ता है। \n
Go का Python के साथ एकीकरण: समझदारी से स्क्रिप्टिंग
\n\nPython और Go एक बेहतरीन जोड़ी हैं। Go गति और समानता के लिए, Python लचीलेपन और पारिस्थितिकी तंत्र (NumPy, TensorFlow) के लिए। उन्हें कैसे जोड़ा जाए? हमारे पास दो दृष्टिकोण हैं: 'भारी' (cgo और Python C API के माध्यम से) और 'हल्का' (उपप्रक्रियाओं के माध्यम से)।
\n\nतरीका 1: os/exec के माध्यम से Python को कॉल करना (सरल और विश्वसनीय)
\n\nशिक्षा के लिए सबसे सुरक्षित तरीका Python स्क्रिप्ट को एक अलग प्रक्रिया के रूप में चलाना है।