【发布时间】:2021-02-15 00:18:57
【问题描述】:
我想检查给定的 f interface{} 函数参数是否是指向结构的指针,但不知何故正在苦苦挣扎:
更新了sn-p:
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 struct; is ptr。
如果将f 作为结构传递给函数,我会得到一个not ptr; is struct。
有什么方法可以确保接口是指向结构的指针?似乎只要f 是一个指针,通过反射进行的任何进一步检查都在这里不可用。我发现的许多其他解决方案可以通过类型断言来处理,但我只是不知道这里会发生什么。基本上它可以是任何东西。
当然,我可以只使用指针检查并将其他所有内容都保留为“开发人员错误”。我只是想我可以以某种方式处理它。
有什么想法吗?
【问题讨论】:
-
它怎么可能同时是一个指针和一个结构体?你想在这里做什么?
-
我正在使用
reflect.ValueOf(f).Elem()稍后读取字段值等。如果不是&struct和panic: reflect: call of reflect.Value.Elem on struct Value,这将失败。我只是想抓住它。 -
所以你正在寻找一个 to 结构的指针?
-
我更新了示例代码。如果这两个检查被删除并且仅使用一个结构触发功能,它就会恐慌。只是想抓住那个。当然它不能同时是一个结构和一个ptr。只是觉得反思可以帮助我。
-
检查 kind 是否是两个互斥选项是没有意义的。如果你想要一个指向结构的指针,请检查它。如果你想要,那么只需尊重指针。
标签: go pointers struct reflection assertion