quux00的答案只講述了比較基本類型。
如果您需要比較您定義的類型,則不應使用reflect.TypeOf(xxx)
。相反,請使用reflect.TypeOf(xxx).Kind()
。
有兩類類型:
- 直接類型(你直接定義的類型)
- 基本類型(int,float64,結構,...)
這是一個完整的例子:
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