प्राक्कथन: यह तर्क दिए बिना कि if else
जाने का तरीका है, हम अभी भी भाषा-सक्षम निर्माणों में आनंद ले सकते हैं।
निम्न If
निर्माण मेरे github.com/icza/gox
पुस्तकालय में कई अन्य विधियों के साथ उपलब्ध है , builtinx.If
प्रकार है।
जा किसी भी उपयोगकर्ता-परिभाषित प्रकार के तरीकों को संलग्न करने की अनुमति देता है , जैसे कि आदिम प्रकार bool
। हम एक कस्टम प्रकार bool
को अपने अंतर्निहित प्रकार के रूप में बना सकते हैं , और फिर एक साधारण प्रकार के रूपांतरण के साथ शर्त पर , हम इसके तरीकों तक पहुंच सकते हैं। ऑपरेंड से प्राप्त करने और चयन करने के तरीके।
कुछ इस तरह:
type If bool
func (c If) Int(a, b int) int {
if c {
return a
}
return b
}
हम इसका उपयोग कैसे कर सकते हैं?
i := If(condition).Int(val1, val2) // Short variable declaration, i is of type int
|-----------| \
type conversion \---method call
उदाहरण के लिए एक टर्नरी कर max()
:
i := If(a > b).Int(a, b)
एक टर्नरी कर abs()
:
i := If(a >= 0).Int(a, -a)
यह अच्छा लग रहा है, यह सरल, सुरुचिपूर्ण और कुशल है (यह इनलाइनिंग के लिए भी योग्य है )।
एक "वास्तविक" टर्नरी ऑपरेटर की तुलना में एक नकारात्मक पहलू: यह हमेशा सभी ऑपरेंड का मूल्यांकन करता है।
आस्थगित और केवल-अगर-आवश्यक मूल्यांकन प्राप्त करने के लिए, एकमात्र विकल्प फ़ंक्शंस का उपयोग करना है (या तो घोषित फ़ंक्शंस या विधियाँ, या फ़ंक्शन शाब्दिक ), जिन्हें केवल जब / यदि आवश्यक हो तो कहा जाता है:
func (c If) Fint(fa, fb func() int) int {
if c {
return fa()
}
return fb()
}
इसका उपयोग करना: मान लें कि गणना करने के लिए हमारे पास ये कार्य हैं a
और b
:
func calca() int { return 3 }
func calcb() int { return 4 }
फिर:
i := If(someCondition).Fint(calca, calcb)
उदाहरण के लिए, स्थिति वर्तमान वर्ष> 2020:
i := If(time.Now().Year() > 2020).Fint(calca, calcb)
अगर हम फंक्शन शाब्दिक का उपयोग करना चाहते हैं:
i := If(time.Now().Year() > 2020).Fint(
func() int { return 3 },
func() int { return 4 },
)
अंतिम नोट: यदि आपके पास अलग-अलग हस्ताक्षर वाले कार्य होंगे, तो आप उन्हें यहां उपयोग नहीं कर सकते। उस स्थिति में आप उन्हें अभी भी लागू करने के लिए मिलान हस्ताक्षर के साथ एक फ़ंक्शन शाब्दिक का उपयोग कर सकते हैं।
उदाहरण के लिए अगर calca()
और calcb()
भी पैरामीटर (वापसी मूल्य के अलावा) होगा:
func calca2(x int) int { return 3 }
func calcb2(x int) int { return 4 }
इस तरह आप उनका उपयोग कर सकते हैं:
i := If(time.Now().Year() > 2020).Fint(
func() int { return calca2(0) },
func() int { return calcb2(0) },
)
गो प्लेग्राउंड पर इन उदाहरणों को आज़माएं ।