2014-07-08 20 views
21

में लोड पैकेज गतिशील रूप से रनटाइम के दौरान एक विशिष्ट पैकेज लोड करना संभव है? मैं एक प्रकार का प्लगइन्स रखना चाहता हूं जहां प्रत्येक के पास दूसरों के मुकाबले समान कार्य हों लेकिन विभिन्न व्यवहार के साथ, और कॉन्फ़िगरेशन फ़ाइल के आधार पर, एक या दूसरे लोड करें। धन्यवाद।गोलांग

उत्तर

9

आप रनटाइम पर 'प्लगइन' संकुल को क्रियान्वित करने, बाहर एक नए कार्यक्रम exec.Command("go", "run", files…).Run()

की तर्ज आप कुछ देखेंगे साथ कुछ लिख (जैसे कि, एक अस्थायी निर्देशिका के लिए) और exec.Command के माध्यम से क्रियान्वित करने, द्वारा विचार कर सकते हैं समान कोड here

+0

हाय, धन्यवाद, यह मेरी समस्या का समाधान कर सकता है, और मैं शून्य एमक्यू या इसी तरह दोनों के साथ संवाद कर सकता हूं। – Pepeluis

+2

मैं कई प्लगइन स्वतंत्र रूप से बनाकर "गतिशील लोडिंग" करता हूं, इन प्लगइन्स को stdin से डेटा पढ़ने का समर्थन करना चाहिए, फिर main.go में, मैंने एक कॉन्फ़िगरेशन फ़ाइल से प्लगइन सूची पढ़ी है, फिर exec.Command का उपयोग प्रत्येक प्लगइन को शुरू करने के लिए करें (जाने में दिनचर्या), तो मैं प्लगइन्स 'StdinPipe पर लिख सकता हूं, और प्रत्येक प्लगइन पढ़ सकता है। – zhaozhi

20

नहीं, गो गतिशील रूप से लोड की गई पुस्तकालयों का समर्थन नहीं करता है।

आपकी सबसे अच्छी शर्त प्लगइन को अपने निष्पादन योग्य के रूप में शुरू करना है और सॉकेट के माध्यम से या stdin/stdout के माध्यम से इसके साथ संवाद करना है।

2017 अद्यतन

इस उत्तर सही नहीं रह गया है, जाओ अब plugins का समर्थन करता है।

+0

लेकिन उस तरह से, मैं पैकेज को कैसे लोड कर सकता हूं यह जानने के बिना कि पैकेज का उपयोग कब किया जा सकता है? – Pepeluis

+3

लेकिन अभी भी केवल लिनक्स पर (1.8 के रूप में) – user2679859

+1

खैर, लिनक्स और ओएसएक्स। – OneOfOne

-3

मुझे लगता है कि आप देख रहे हैं विशेष समारोह init

है अगर आप एक पैकेज के अंदर एक

func init() { 

} 

जोड़ने यह यह पहली बार पैकेज आयात किया जाता है चलेंगे। यह केवल एक ही बाइनरी में होता है। जैसा कि पहले से ही कहा गया है, गतिशील रूप से लोड पुस्तकालयों का समर्थन नहीं करता है।

+0

init के साथ समस्या यह है कि मुझे नहीं पता कि कॉन्फ़िगरेशन फ़ाइल पढ़ने तक कौन सा पैकेज लोड किया जाना चाहिए। तो अगर मैं गतिशील रूप से एक पैकेज लोड नहीं कर सकता, तो init रास्ता समाधान नहीं है। – Pepeluis

1

बस ऐसा करें, कॉन्फ़िगरेशन को पढ़ने वाले कोडेजन बनाएं, क्रम में लोड किए गए संकुल के साथ मूलभूत फ़ाइल फ़ाइल उत्पन्न करें और उसके बाद निष्पादित करें, संकलित भाषाएं न ही गतिशील लोडिंग प्रदान करेंगी, यहां तक ​​कि डार्ट भी एक तरह से पीड़ित नहीं है, सरल अभी-अभी पढ़ा अपने विन्यास फाइल तो आवश्यक कोड के साथ एक अस्थायी फ़ाइल बनाने के लोड और सॉकेट या http

+2

"संकलित भाषाएं गतिशील लोडिंग प्रदान नहीं करेंगे और न ही" - c/C++ संकलित भाषाएं हैं और वे इसे 'dlopen' के माध्यम से प्रदान करते हैं। वस्तुतः सभी भाषाएं जाने के अलावा कुछ प्रकार की गतिशील लोडिंग प्रदान करती हैं। – Petar

+1

और अब एक [dlopen-package for go] है (https://godoc.org/github.com/cookieo9/goffi/dlopen), जो साझा पुस्तकालयों के उपयोग की अनुमति देता है। आप उन्हें कैसे उत्पन्न करते हैं - और क्या आप गो-कोड को _library_ में बदल सकते हैं - अलग-अलग चिंताएं हैं ... –