在去
问题描述:
类型断言我有这样的代码片段:在去
if (reflect.TypeOf(device).String() == "*types.VirtualDisk") {
disk := device.(types.VirtualDisk)
fmt.Printf("%v - %v \n", "capacityInKB", disk.CapacityInKB)
}
,而我得到:
不可能类型断言:types.VirtualDisk没有实现 types.BaseVirtualDevice(GetVirtualDevice方法具有指针接收器)
,但如果我将它修改为
if (reflect.TypeOf(device).String() == "*types.VirtualDisk") {
//disk := device.(types.VirtualDisk)
fmt.Printf("%v - %v \n", "capacityInKB", device)//disk.CapacityInKB)
}
它的工作原理和打印对象的所有属性。我想如何转换呢?
答
错误提示您要键入断言的类型是*types.VirtualDisk
而不是types.VirtualDisk
。
此外,你试图做的反射技巧是完全没有必要的,因为有一个special form of the type assertion它报告断言是否成立。
见这个例子:
if disk, ok := device.(*types.VirtualDisk); ok {
// Type assertion holds, disk is of type *types.VirtualDisk
// You may use it so
}
@马里奥斯托伊洛夫,我同意:你应该使用'reflect'包尽可能多的,你可以abstrain。在大多数情况下,使用它会使代码异味成为真正需要的唯一情况,那就是当您使用(用户提供的)类型时,您事先完全不了解,并且必须在运行时检查它们的结构。 'encoding/xml'和'encoding/json'包是两个很好的例子。 – kostix