2017-01-06 8 views
8

में इंटरफ़ेस और पूर्णांक तुलना मुझे समझ में नहीं आता कि पहला परिणाम गलत क्यों है जबकि दूसरा सत्य है।गोलांग

किसी भी मदद की सराहना की जाएगी।

func main() { 
    var i interface{} 

    i = uint64(0) 
    fmt.Println("[1] ", reflect.TypeOf(i), i == 0) 

    i = 0 
    fmt.Println("[2] ", reflect.TypeOf(i), i == 0) 

    var n uint64 = 32 
    fmt.Println("[3] ", reflect.TypeOf(n), n == 32) 
} 

// result 
// [1] uint64 false 
// [2] int true 
// [3] uint64 true 

क्योंकि 0 एक untyped निरंतर जिसका डिफ़ॉल्ट प्रकार int, नहीं uint64, और जब एक अंतरफलक के साथ तुलना कर रही है, बात आप तुलना कर रहे हैं दोनों एक ही प्रकार होना चाहिए करने के लिए है इसे यहाँ Go playground

उत्तर

10

प्रयास करें और उनके लिए समान मूल्य बराबर माना जाना चाहिए।

https://golang.org/ref/spec#Comparison_operators

समानता ऑपरेटरों == और! = ऑपरेंड कि तुलनीय हैं पर लागू होते हैं। ऑर्डरिंग ऑपरेटर <, < =,>, और> = आदेश दिए गए ऑपरेंड पर लागू होते हैं। इन शर्तों और तुलना के परिणाम निम्नानुसार परिभाषित किए गए हैं:

गैर-इंटरफ़ेस प्रकार एक्स का मान x और इंटरफ़ेस प्रकार टी का मान टी तुलनीय है जब प्रकार एक्स के मान तुलनीय हैं और एक्स लागू होते हैं। वे हैं बराबर यदि टी का गतिशील प्रकार एक्स और टी के गतिशील मान के समान है x के बराबर है।

+0

तुम क्यों == इस तरह के 'मैं। (Uint64) के रूप में प्रकार दावे का उपयोग कर सकते 0'? क्या संकलक मानता है कि '0' एक 'uint64' भी है? https://play.golang.org/p/YT-pZCdI27 – Ngenator

+2

एक बार जब आप एक प्रकार दावे करते हैं, आप लंबे समय तक एक मूल्य के साथ एक इंटरफेस की तुलना नहीं कर रहे हैं, तो आप एक मूल्य के साथ एक मूल्य की तुलना कर रहे हैं ताकि आप की आवश्यकता को खो देते हैं उनके गतिशील प्रकार बराबर होने की आवश्यकता है। – dave

+1

तकनीकी तौर पर '0' एक' int' नहीं है, यह एक [ "untyped निरंतर"] (https://golang.org/ref/spec#Constants) है कि एक डिफ़ॉल्ट प्रकार में बदला न गया में इसकी नियुक्ति की वजह से 'int' एक अभिव्यक्ति। – JimB