如何判断我的接口{}是否为指针?

时间:2015-07-08 06:54:54

标签: go

如果我将一个接口传递给一个函数,有没有办法判断传入的项是结构还是指向结构的指针?我写了这个愚蠢的测试来说明我需要弄清楚的事情。

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")
    }
}

3 个答案:

答案 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)