首页 > 解决方案 > 如何判断对象是否为复合(类型)

问题描述

例如, x interface{}给出。如果它是复合类型(结构或指向结构的指针)或“简单”类型,如string, int,float等,如何确定(可能使用反射)?

标签: gostructreflectiontypes

解决方案


你可以使用 package reflect,获取它的类型,然后检查它的种类。如果它是指针类型,则“导航”到指向的类型:

func isStruct(i interface{}) bool {
    t := reflect.TypeOf(i)
    if t.Kind() == reflect.Ptr {
        t = t.Elem()
    }
    return t.Kind() == reflect.Struct
}

测试它:

fmt.Println(isStruct("text"))
fmt.Println(isStruct(1))
fmt.Println(isStruct(image.Point{}))
fmt.Println(isStruct(&image.Point{}))

输出(在Go Playground上试试):

false
false
true
true

推荐阅读