如果我将一个接口传递给一个函数,有没有办法判断传入的项是结构还是指向结构的指针?我写了这个愚蠢的测试来说明我需要弄清楚的事情。
type MyStruct struct {
Value string
}
func TestInterfaceIsOrIsntPointer(t *testing.T) {
var myStruct interface{} = MyStruct{Value: "hello1"}
var myPointerToStruct interface{} = &MyStruct{Value: "hello1"}
// the IsPointer method doesn't exist on interface, but I need something like this
if myStruct.IsPointer() || !myPointerToStruct.IsPointer() {
t.Fatal("expected myStruct to not be pointer and myPointerToStruct to be a pointer")
}
}
答案 0 :(得分:3)
func isStruct(i interface{}) bool {
return reflect.ValueOf(i).Type().Kind == reflect.Struct
}
您可以根据需要通过更改类型进行测试,例如reflect.Ptr
。在确保它为指针后,您甚至可以使用reflect.Indirect(reflect.ValueOf(i))
获得有针对性的值。
增加:
似乎reflect.Value
有一个Kind
方法,所以reflect.ValueOf(i).Kind()
就足够了。
答案 1 :(得分:1)
如果你知道界面的“真实”类型,你只需使用type switch
:
allow_privileged
代码较长,但至少您不需要使用type MyStruct struct {
Value string
}
func TestInterfaceIsOrIsntPointer(t *testing.T) {
var myStruct interface{} = MyStruct{Value: "hello1"}
var myPointerToStruct interface{} = &MyStruct{Value: "hello1"}
// the IsPointer method doesn't exist on interface, but I need something like this
switch myStruct.(type) {
case MyStruct:
// ok
break
case *MyStruct:
// error here
break
}
switch myPointerToStruct.(type) {
case MyStruct:
// error here
break
case *MyStruct:
// ok
break
}
}
包。
答案 2 :(得分:0)
您可以使用反射包:
i := 42
j := &i
kindOfJ := reflect.ValueOf(j).Kind()
fmt.Print(kindOfJ == reflect.Ptr)