La réponse de quux00 ne parle que de la comparaison des types de base.
Si vous avez besoin de comparer des types que vous avez définis, vous ne devriez pas utiliser reflect.TypeOf(xxx)
. Au lieu de cela, utilisez reflect.TypeOf(xxx).Kind()
.
Il existe deux catégories de types :
- les types directs (les types que vous avez définis directement)
- types de base (int, float64, struct, ...)
Voici un exemple complet :
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")
}
La sortie serait :
main.Vertex
struct
main.MyFloat
float64
Not equal typeOf
Not equal kind
Equal typeOf
Equal kind
Comme vous pouvez le voir, reflect.TypeOf(xxx)
renvoie les types directs que vous pourriez vouloir utiliser, tandis que reflect.TypeOf(xxx).Kind()
renvoie les types de base.
Voici la conclusion. Si vous avez besoin de comparer avec des types de base, utilisez reflect.TypeOf(xxx).Kind()
; et si vous avez besoin de comparer avec des types auto-définis, utilisez 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")
}