登录
首页 >  Golang >  Go问答

如何判断具有类型接口的参数是否具备结构属性?

来源:stackoverflow

时间:2024-03-25 17:36:34 208浏览 收藏

在 Go 语言中,可以使用反射机制判断一个具有类型接口的参数是否具备结构属性。使用 `reflect.ValueOf()` 获取接口的反射值,再用 `reflect.Kind()` 检查其类型。如果类型为 `reflect.Struct`,则参数是一个结构体。若要检查指向结构体的指针,需要先使用 `reflect.Indirect()` 获取指向的结构体,然后再检查类型。

问题内容

我有一个接受接口的函数{}

func MyFunk(itf interface{}) {
}

我想知道传递的 itf 是否是一个结构体,这可能吗?我尝试了几种反射组合,我能得到的结果是 ptr (指针)。


解决方案


使用以下代码来检测参数是否是结构:

func myfunk(itf interface{}) {
    v := reflect.valueof(itf)
    if v.kind() == reflect.struct {
        // it's a struct
    }
}

如果您还想检查指向结构的指针,请使用以下代码:

func myfunk(itf interface{}) {
    v := reflect.indirect(reflect.valueof(itf))
    if v.kind() == reflect.struct {
        // it's a struct
    }
}

使用 reflect 包,您可以检查结构类型和指向结构的指针:

func MyFunk(itf interface{}) {
    t := reflect.TypeOf(itf)

    if t.Kind() == reflect.Struct {
        // itf is a struct
    } else if t.Kind() == reflect.Ptr {
        pt := t.Elem()
        if pt.Kind() == reflect.Struct {
            // itf is a pointer to a struct
        } else {
            // itf is a pointer to something else
        }
    } else {
        // itf is something else entirely
    }
}

今天关于《如何判断具有类型接口的参数是否具备结构属性?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>