Go Academy · पाठ

गतिशील फ़ंक्शन कॉल

reflect से फ़ंक्शन कॉल करना और मान सेट करना

पाठ 3, कुल 4 में से13 चरण

गतिशील फ़ंक्शन कॉल, CoddyKit पर Go Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Go Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Go Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

reflect.Value.Call

Value.Call(args), दिए गए तर्कों ( []reflect.Value के रूप में) के साथ Value द्वारा दर्शाए गए फ़ंक्शन को कॉल करता है और परिणामों को []reflect.Value के रूप में लौटाता है।

fn := reflect.ValueOf(add)
results := fn.Call([]reflect.Value{
    reflect.ValueOf(2),
    reflect.ValueOf(3),
})
fmt.Println(results[0].Int()) // 5

तर्क प्रकार की जाँच

कॉल करने से पहले सुनिश्चित करें कि तर्कों के प्रकार फ़ंक्शन के सिग्नेचर से मेल खाते हैं। असंगत प्रकार पैनिक उत्पन्न करते हैं।

t := reflect.TypeOf(fn)
if t.NumIn() != len(args) { panic("wrong arg count") }
for i, arg := range args {
    if !reflect.TypeOf(arg).AssignableTo(t.In(i)) { panic("type mismatch") }
}

वेरिएडिक फ़ंक्शन

वेरिएडिक फ़ंक्शन को Value.Call के साथ कॉल करें (स्लाइस का विस्तार करके) या Value.CallSlice के साथ कॉल करें (वेरिएडिक तर्कों को स्लाइस मान के रूप में पास करके):

sum := reflect.ValueOf(func(ns ...int) int {
    total := 0
    for _, n := range ns { total += n }
    return total
})
args := reflect.ValueOf([]int{1,2,3})
results := sum.CallSlice([]reflect.Value{args})

reflect.MakeFunc

reflect.MakeFunc दिए गए प्रकार और रैपर बॉडी के साथ रनटाइम पर नया फ़ंक्शन बनाता है। इसका उपयोग इंटरफ़ेस के लिए एडेप्टर फ़ंक्शन बनाने में किया जाता है।

t := reflect.TypeOf(func(int) string { return "" })
fn := reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value {
    return []reflect.Value{reflect.ValueOf(strconv.Itoa(args[0].Interface().(int)))}
})

नाम के आधार पर विधियों को कॉल करना

नाम के आधार पर किसी विधि को प्राप्त करें और उसे कॉल करें:

v := reflect.ValueOf(myObj)
m := v.MethodByName("Process")
if m.IsValid() {
    m.Call(nil)
}

जाँचना कि विधि मौजूद है या नहीं

कॉल करने से पहले हमेशा m.IsValid() की जाँच करें — विधि न मिलने पर MethodByName शून्य Value लौटाता है और शून्य Value को कॉल करने पर पैनिक होता है।

गतिशील डिस्पैच के उपयोग के उदाहरण

गतिशील फ़ंक्शन कॉल का उपयोग प्लगइन प्रणालियों (स्ट्रिंग नाम से फ़ंक्शन कॉल करना), परीक्षण फ़्रेमवर्क (TestXxx फ़ंक्शन कॉल करना), RPC डिस्पैचर (विधि नामों को हैंडलर से मैप करना) और डेकोरेटर में किया जाता है।

प्रदर्शन

reflect.Call, सीधे कॉल की तुलना में लगभग 10–50 गुना धीमा होता है। बार-बार कॉल किए जाने वाले फ़ंक्शन के reflect.Value को कैश करें और हॉट लूप में इसका उपयोग न करें।

प्रकार-सुरक्षित रैपर

गतिशील कॉल को ऐसे टाइप किए गए सहायक में लपेटें, जो स्टार्टअप के दौरान रिफ्लेक्शन संबंधी प्रक्रिया एक बार करता है और फिर कैश किए गए Value को बार-बार कॉल करता है:

type Processor func(context.Context, []byte) ([]byte, error)
// Build at startup, reuse at request time

त्रुटि लौटाने का प्रबंधन

यदि फ़ंक्शन अपने अंतिम परिणाम के रूप में कोई त्रुटि लौटाता है, तो उसे निकालकर जाँच करें:

results := fn.Call(args)
if !results[len(results)-1].IsNil() {
    return results[len(results)-1].Interface().(error)
}

रिफ्लेक्शन के विकल्प

यदि फ़ंक्शन का सेट कंपाइल समय पर ज्ञात हो, तो रिफ्लेक्शन के बजाय फ़ंक्शन मानों के मैप (map[string]func(...)) का उपयोग करें — यह अधिक सुरक्षित और तेज़ है।

handlers := map[string]func(ctx context.Context, req []byte) []byte{
    "greet": greetHandler,
}

त्वरित जाँच

reflect.Value.Call क्या लौटाता है?

पुनरावलोकन: गतिशील फ़ंक्शन कॉल

मुख्य बिंदु:

  • Value.Call([]reflect.Value) फ़ंक्शन को लागू करता है और []reflect.Value लौटाता है
  • MethodByName के परिणाम को कॉल करने से पहले m.IsValid() की जाँच करें
  • MakeFunc रनटाइम पर दिए गए प्रकार के साथ नया फ़ंक्शन बनाता है
  • ज्ञात फ़ंक्शन सेट के लिए रिफ्लेक्शन की जगह map[string]func को प्राथमिकता दें
शुरुआत निःशुल्क

एआई शिक्षक के साथ Go सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “गतिशील फ़ंक्शन कॉल” पाठ निःशुल्क है?

हाँ — Go Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “गतिशील फ़ंक्शन कॉल” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Go Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“गतिशील फ़ंक्शन कॉल” में मैं क्या सीखूँगा?

reflect से फ़ंक्शन कॉल करना और मान सेट करना आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Go Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Go Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Go Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“गतिशील फ़ंक्शन कॉल” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Go Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Go Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. reflect.Type और reflect.Value
  2. Struct फ़ील्ड और टैग का निरीक्षण
  3. गतिशील फ़ंक्शन कॉल
  4. व्यावहारिक Reflection: Serializer
← Go Academy पर वापस जाएँ