go中的类型断言

go中的类型断言,go,interface,type-assertion,Go,Interface,Type Assertion,我有以下代码片段: if (reflect.TypeOf(device).String() == "*types.VirtualDisk") { disk := device.(types.VirtualDisk) fmt.Printf("%v - %v \n", "capacityInKB", disk.CapacityInKB) } 我得到: 不可能的类型断言:types.VirtualDisk未实现 types.BaseVirtualDevice(GetVirtualDe

我有以下代码片段:

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

另外,您尝试执行的反射技巧完全没有必要,因为有一个报告断言是否成立的方法

请参见此示例:

if disk, ok := device.(*types.VirtualDisk); ok {
    // Type assertion holds, disk is of type *types.VirtualDisk
    // You may use it so
}

错误提示您要键入断言的类型是
*types.VirtualDisk
,而不是
types.VirtualDisk

另外,您尝试执行的反射技巧完全没有必要,因为有一个报告断言是否成立的方法

请参见此示例:

if disk, ok := device.(*types.VirtualDisk); ok {
    // Type assertion holds, disk is of type *types.VirtualDisk
    // You may use it so
}

@马里奥·斯托伊洛夫,我同意:你应该尽量避免使用
reflect
软件包。大多数情况下,使用它会发出代码气味的信号,因为真正需要它的唯一情况是当您使用(用户提供的)类型时,您事先完全不知道这些类型,并且必须在运行时检查它们的结构。
encoding/xml
encoding/json
包是两个很好的例子。@mario stoilov,我同意:你应该尽量避免使用
reflect
包。大多数情况下,使用它会发出代码气味的信号,因为真正需要它的唯一情况是当您使用(用户提供的)类型时,您事先完全不知道这些类型,并且必须在运行时检查它们的结构。
encoding/xml
encoding/json
包是两个非常好的例子。