如何确定对象是否为复合(类型)

时间:2018-12-04 11:14:20

标签: go struct reflection types

例如,给出x interface{}。如果它是复合类型(结构或指向结构的指针)或“简单”类型(如stringintfloat等),如何确定(也许使用反射)? / p>

1 个答案:

答案 0 :(得分:3)

您可以使用软件包reflect,获取其类型并检查其kind。如果是指针类型,则“导航”到指针类型:

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