Câu trả lời của quux00 chỉ cho biết về việc so sánh các loại cơ bản.
Nếu bạn cần so sánh các loại bạn đã xác định, bạn không nên sử dụng reflect.TypeOf(xxx)
. Thay vào đó, hãy sử dụng reflect.TypeOf(xxx).Kind()
.
Có hai loại của các loại:
- loại trực tiếp (các loại bạn định nghĩa trực tiếp)
- loại cơ bản (int, float64, struct, ...)
Đây là một ví dụ đầy đủ:
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")
}
Kết quả sẽ là:
main.Vertex
struct
main.MyFloat
float64
Not equal typeOf
Not equal kind
Equal typeOf
Equal kind
Như bạn thấy, reflect.TypeOf(xxx)
trả về loại trực tiếp mà bạn có thể muốn sử dụng, trong khi reflect.TypeOf(xxx).Kind()
trả về các loại cơ bản.
Đây là kết luận. Nếu bạn cần so sánh với các loại cơ bản, hãy sử dụng reflect.TypeOf(xxx).Kind()
; và nếu bạn cần so sánh với các loại tự định nghĩa, hãy sử dụng 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")
}
Câu trả lời phải hoàn tất, không chỉ liên kết. Vui lòng đưa ra câu trả lời này. – Flimzy
Lưu ý: Tính năng này không hoạt động đối với các loại bê tông, chỉ có các loại giao diện. – darethas