3 回答
TA贡献1772条经验 获得超5个赞
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()就够了。
TA贡献1864条经验 获得超2个赞
您可以使用反射包:
i := 42
j := &i
kindOfJ := reflect.ValueOf(j).Kind()
fmt.Print(kindOfJ == reflect.Ptr)
TA贡献2003条经验 获得超2个赞
如果您知道接口的“真实”类型,则可以简单地使用type switch:
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
}
}
代码较长,但至少您不需要使用该reflect包。
- 3 回答
- 0 关注
- 382 浏览
添加回答
举报