मैं गो में एक छोटा स्टैंडअलोन वेब एप्लिकेशन बनाना चाहता था, जो एक नियमित वेब एप्लिकेशन के विपरीत था जहां संसाधनों को सीडीएन या HTTP सर्वर जैसे कि Nginx के माध्यम से अलग से परोसा जाएगा। हालाँकि, यदि प्रदर्शन कोई गंभीर चिंता का विषय नहीं है या एप्लिकेशन कम ट्रैफ़िक के लिए है, तो स्टैंडअलोन एप्लिकेशन का उपयोग तैनाती और वितरण को सरल बनाता है क्योंकि यह सिर्फ एक निष्पादन योग्य बाइनरी है। गो एप्लिकेशन में संसाधनों को एम्बेड करने के लिए कई पैकेज उपलब्ध हैं: चावल स्टेटिक बिंदता मैं प्रत्येक लाइब्रेरी की बारीकियों में नहीं जाऊंगा, लेकिन इसके उपयोग में आसानी और सक्रिय समर्थन के कारण मैं दृष्टिकोण को प्राथमिकता देता हूं। बिंदाटा शुरू करना सबसे पहले, आइए अपने प्रोजेक्ट में डायरेक्टरी के अंदर एक बनाएं: frontend/ index.html <html> <body> Hello, World! </body> </html> अब जबकि हमारे पास परीक्षण के लिए एक प्रोजेक्ट सेटअप और एक स्थिर संसाधन है, आइए कमांड का उपयोग करके इंस्टॉल करें: बाइंडटा go get -u github.com/jteeuwen/go-bindata/... हम वेब एप्लिकेशन का बैकएंड कोड चलाने के लिए तैयार हैं। एक फ़ाइल बनाएं और निम्नलिखित कोड कॉपी करें: main.go package main import ( "bytes" "io" "net/http" ) //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... func static_handler(rw http.ResponseWriter, req *http.Request) { var path string = req.URL.Path if path == "" { path = "index.html" } if bs, err := Asset(path); err != nil { rw.WriteHeader(http.StatusNotFound) } else { var reader = bytes.NewBuffer(bs) io.Copy(rw, reader) } } func main() { http.Handle("/", http.StripPrefix("/", http.HandlerFunc(static_handler))) http.ListenAndServe(":3000", nil) } इस कोड में महत्वपूर्ण पंक्ति: //go:generate go-bindata -prefix "frontend/" -pkg main -o bindata.go frontend/... जब कहा जाता है तो उपरोक्त पंक्ति हमें कमांड चलाने की अनुमति देती है। संस्करण 1.4 के अनुसार, आप जनरेशन चरण के दौरान कस्टम कमांड चला सकते हैं। यह केवल आपकी गो फ़ाइल में जोड़ने की बात है। go generate go-bindata //go:generate command argument... कमांड लाइन में कई पैरामीटर हैं, इसलिए इसका उपयोग करने के तरीके पर जाँच करें। हमारे मामले में, हम कहते हैं: go-bindata दस्तावेज़ की स्थैतिक के लिए पथनाम के भाग को परिभाषित करता है -prefix "frontend/" जेनरेट कोड में प्रयुक्त पैकेज नाम को परिभाषित करता है -pkg main जेनरेट की गई फ़ाइल का नाम परिभाषित करें -o bindata.go कमांड चलाने के बाद, आपको नाम की एक जेनरेट की गई फ़ाइल देखनी चाहिए। आपके प्रोजेक्ट की संरचना इस तरह दिखनी चाहिए: go generate bindata.go . │ ├── bindata.go (auto-generated file) ├── frontend │ └── index.html └── main.go स्थैतिक फ़ाइलों को प्रस्तुत करने का तर्क फ़ंक्शन में है, जो अनुरोध प्राप्त करता है और जाँचता है कि पथ स्थैतिक पथ से मेल खाता है या नहीं। चेक फ़ंक्शन का उपयोग करके किया जाता है, जो स्वचालित रूप से उपयोगकर्ता द्वारा निर्यात किया जाता है। यदि संसाधन मौजूद नहीं है, तो हम लौटाते हैं, अन्यथा, हम संसाधन की सामग्री लौटाते हैं। static_handler Asset bindata.go 404 बाकी कोड वेब एप्लिकेशन बनाने और के लिए आने वाले सभी अनुरोधों से मेल खाने के लिए हमारे टेम्पलेट को बाइंड करने के लिए है। यदि आपको इस कोड को समझने में परेशानी हो रही है, तो के लिए आधिकारिक गो देखें। / static_handler http package दस्तावेज़ गो पैकेजों को कैसे संभालता है, इसकी एक त्वरित अनुस्मारक के रूप में, यदि पहचानकर्ता नाम का पहला अक्षर बड़े अक्षर से शुरू होता है तो सभी पहचानकर्ता स्वचालित रूप से उसी नाम के साथ अन्य पैकेजों में निर्यात किए जाएंगे। इस नियम के आधार पर, फ़ाइल पैकेज के लिए फ़ंक्शन प्रदान करती है। यह दिए गए नाम के लिए एक परिसंपत्ति को लोड और लौटाता है। यदि संसाधन नहीं मिल पाता है या लोड नहीं किया जा सकता है तो यह एक त्रुटि देता है। bindata.go main Asset