La respuesta del quux00 solo dice acerca de la comparación de tipos básicos.
Si necesita comparar los tipos que ha definido, no debe usar reflect.TypeOf(xxx)
. En su lugar, use reflect.TypeOf(xxx).Kind()
.
Hay dos categorías de tipos:
- tipos directos (los tipos definidos directamente)
- tipos básicos (int, float64, estructura, ...)
Aquí es un ejemplo completo:
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 salida sería:
main.Vertex
struct
main.MyFloat
float64
Not equal typeOf
Not equal kind
Equal typeOf
Equal kind
Como se puede ver, reflect.TypeOf(xxx)
devuelve los tipos directos, que es posible que desee utilizar, mientras reflect.TypeOf(xxx).Kind()
devuelve los tipos básicos.
Aquí está la conclusión. Si necesita comparar con tipos básicos, use reflect.TypeOf(xxx).Kind()
; y si necesita comparar con tipos autodefinidos, use 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")
}
Las respuestas deben estar completas, no solo en los enlaces. Por favor desarrolla esta respuesta. – Flimzy
nota: Esto no funciona para tipos concretos, solo tipos de interfaz. – darethas