quux00 का उत्तर केवल मूल प्रकारों की तुलना करने के बारे में बताता है।
यदि आपको परिभाषित प्रकारों की तुलना करने की आवश्यकता है, तो आपको reflect.TypeOf(xxx)
का उपयोग नहीं करना चाहिए। इसके बजाय, reflect.TypeOf(xxx).Kind()
का उपयोग करें।
ये दो प्रकार की श्रेणियां हैं:
- प्रत्यक्ष प्रकार (प्रकार आपको सीधे परिभाषित)
- बुनियादी प्रकार (पूर्णांक, float64, struct, ...)
यहाँ एक पूर्ण उदाहरण है:
type MyFloat float64
type Vertex struct {
X, Y float64
}
type EmptyInterface interface {}
type Abser interface {
Abs() float64
}
func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
func (f MyFloat) Abs() float64 {
return math.Abs(float64(f))
}
var ia, ib Abser
ia = Vertex{1, 2}
ib = MyFloat(1)
fmt.Println(reflect.TypeOf(ia))
fmt.Println(reflect.TypeOf(ia).Kind())
fmt.Println(reflect.TypeOf(ib))
fmt.Println(reflect.TypeOf(ib).Kind())
if reflect.TypeOf(ia) != reflect.TypeOf(ib) {
fmt.Println("Not equal typeOf")
}
if reflect.TypeOf(ia).Kind() != reflect.TypeOf(ib).Kind() {
fmt.Println("Not equal kind")
}
ib = Vertex{3, 4}
if reflect.TypeOf(ia) == reflect.TypeOf(ib) {
fmt.Println("Equal typeOf")
}
if reflect.TypeOf(ia).Kind() == reflect.TypeOf(ib).Kind() {
fmt.Println("Equal kind")
}
उत्पादन होगा:
main.Vertex
struct
main.MyFloat
float64
Not equal typeOf
Not equal kind
Equal typeOf
Equal kind
आप देख सकते हैं, reflect.TypeOf(xxx)
प्रत्यक्ष प्रकार जो आप उपयोग करना चाहते हो सकता है देता है, जबकि reflect.TypeOf(xxx).Kind()
मूल प्रकार देता है।
यहां निष्कर्ष निकाला गया है। यदि आपको मूल प्रकारों की तुलना करने की आवश्यकता है, तो reflect.TypeOf(xxx).Kind()
का उपयोग करें; और यदि आपको स्वयं परिभाषित प्रकारों की तुलना करने की आवश्यकता है, तो reflect.TypeOf(xxx)
का उपयोग करें।
if reflect.TypeOf(ia) == reflect.TypeOf(Vertex{}) {
fmt.Println("self-defined")
} else if reflect.TypeOf(ia).Kind() == reflect.Float64 {
fmt.Println("basic types")
}
उत्तर पूर्ण होना चाहिए, सिर्फ लिंक ही नहीं। कृपया इस जवाब को दूर करो। – Flimzy
नोट: यह कंक्रीट प्रकारों, केवल इंटरफ़ेस प्रकारों के लिए काम नहीं करता है। – darethas