在go中键入断言

Mar*_*lov 1 interface go type-assertion

我有这段代码:

if (reflect.TypeOf(device).String() == "*types.VirtualDisk") {
    disk := device.(types.VirtualDisk)
    fmt.Printf("%v - %v \n", "capacityInKB", disk.CapacityInKB)
}
Run Code Online (Sandbox Code Playgroud)

我得到了:

不可能的类型断言: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)
}
Run Code Online (Sandbox Code Playgroud)

它可以工作并打印对象的所有属性.我怎么想转换它?

icz*_*cza 6

该错误提示要输入断言的类型*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
}
Run Code Online (Sandbox Code Playgroud)