繁体   English   中英

检查 interface{} 是否指向结构

[英]Check if interface{} is ptr to struct

我想检查给定的f interface{} function 参数是否是指向结构的指针,但不知何故正在苦苦挣扎:

更新片段:

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作为指针传递给 function 我得到一个not struct; is ptr not struct; is ptr

如果f作为结构传递给 function 我得到一个not ptr; is struct not ptr; is 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM