在去

在去

问题描述:

类型断言我有这样的代码片段:在去

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 
} 
+1

@马里奥斯托伊洛夫,我同意:你应该使用'reflect'包尽可能多的,你可以abstrain。在大多数情况下,使用它会使代码异味成为真正需要的唯一情况,那就是当您使用(用户提供的)类型时,您事先完全不了解,并且必须在运行时检查它们的结构。 'encoding/xml'和'encoding/json'包是两个很好的例子。 – kostix