जाओ में, यदि आप एक नए प्रकार उदा .:मैं उपनाम कार्यों को टाइप क्यों कर सकता हूं और बिना कास्टिंग किए उनका उपयोग कर सकता हूं?
type MyInt int
परिभाषित फिर आप विपरीत पारित कर सकते हैं नहीं एक समारोह के लिए एक MyInt
किसी पूर्णांक की उम्मीद कर, या इसके:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
ठीक। लेकिन फिर यह क्यों है कि यह कार्यों पर लागू नहीं होता है? उदा .:
type MyFunc func(i int)
func (m MyFunc) Run(i int) {
m(i)
}
func run(f MyFunc, i int) {
f.Run(i)
}
func main() {
var newfunc func(int) //explicit declaration
newfunc = func(i int) {
fmt.Println(i)
}
run(newfunc, 10) //works just fine, even though types seem to differ
}
अब
, मैं शिकायत नहीं कर रहा हूँ, क्योंकि यह बचाता है मुझे होने स्पष्ट MyFunc
टाइप करने के लिए, जैसा कि मैंने पहले उदाहरण में क्या करना होगा newfunc
कास्ट करने के लिए; यह सिर्फ असंगत लगता है। मुझे यकीन है कि इसके लिए एक अच्छा कारण है; क्या कोई मुझे प्रबुद्ध कर सकता है?
कारण मैं पूछ मुख्य रूप से, क्योंकि मैं अपनी नहीं बल्कि लंबे प्रकार समारोह से कुछ इस तरह से कम करने के लिए चाहते हैं, लेकिन मुझे यकीन है कि यह उम्मीद है बनाना चाहते और ऐसा करने के लिए :)
** जाओ में, वहाँ एक 'प्रकार alias' जैसी कोई चीज नहीं है। **' type' कीवर्ड नए प्रकार नामित परिचय देता है। वे उपनाम नहीं हैं। (यह विभिन्न अन्य भाषाओं की तुलना में गो की महत्वपूर्ण ताकत है) –
@ रिक -777 टाइप उपनाम जैसी चीज है, उदाहरण के लिए 'byte' 'uint8' के लिए उपनाम है और' rune' 'int32' के लिए उपनाम है, लेकिन यह सच है कि 'टाइप' कीवर्ड उपनाम नहीं बल्कि नए प्रकार बना देता है। – icza
हां, यह इंगित करने के लिए धन्यवाद - दो विशेष मामले हैं: बाइट और रने। ये * उपनाम हैं, लेकिन किसी भी नए उपनाम बनाना संभव नहीं है। https://golang.org/ref/spec#Numeric_types –