登录
首页 >  Golang >  Go问答

判断interface{}是否指向struct

来源:stackoverflow

时间:2024-02-22 10:45:26 257浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《判断interface{}是否指向struct》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我想检查给定的 f 接口{} 函数参数是否是指向结构的指针,但不知何故陷入困境:

更新的代码片段:

package main

import (
    "fmt"
    "log"
    "reflect"
)

func main() {

    // Switch f between being a pointer or not
    f := &struct{Foo string}{"Bar"}

    if err := something(f); err != nil {
        log.Fatal(err.Error())
    }

}

func something(f interface{}) error {

    if reflect.ValueOf(f).Kind() != reflect.Struct  {
        return fmt.Errorf("not struct; is %s", reflect.ValueOf(f).Kind().String())
    }

    if reflect.ValueOf(f).Kind() != reflect.Ptr  {
        return fmt.Errorf("not ptr; is %s", reflect.ValueOf(f).Kind().String())
    }

    // Deal with element values...
    t := reflect.ValueOf(f).Elem()

    for i := 0; i < t.NumField(); i++ {
        fmt.Println(t.Type().String(), t.Field(i).Interface())
    }

    return nil
}

如果 f 作为指针传递给函数,我会得到一个 not 结构;是 ptr

如果 f 作为结构体传递给函数,我会得到一个 not ptr;是struct

有什么方法可以确保接口是指向结构的指针吗?似乎只要 f 是一个指针,任何通过反射进行的进一步检查在这里就无法使用。我发现许多其他解决方案可以通过类型断言来处理,但我只是不知道这里会发生什么。基本上它可以是任何东西。

当然,我可以只使用指针检查,而将其他所有内容保留为“开发人员错误”。我只是想我能以某种方式处理它。

有什么想法吗?


解决方案


使用以下代码。检查指针,取消引用指针并检查结构。

func something(f interface{}) error {
    v := reflect.ValueOf(f)
    if v.Kind() != reflect.Ptr  {
        return fmt.Errorf("not ptr; is %T", f)
    }
    v := v.Elem() // dereference the pointer
    if v.Kind() != reflect.Struct  {
        return fmt.Errorf("not struct; is %T", f)
    }
    t := v.Type()
    for i := 0; i < t.NumField(); i++ {
        sf := t.Field(i)
        fmt.Println(sf.Name, v.Field(i).Interface())
    }
    return nil
}

以上就是《判断interface{}是否指向struct》的详细内容,更多关于的资料请关注golang学习网公众号!

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