[英]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.