在go中键入断言

时间:2016-09-30 12:17:23

标签: 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(GetVirtualDevice方法有指针接收器)

但如果我将其修改为

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

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

1 个答案:

答案 0 :(得分:6)

错误提示您要键入断言的类型为*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
}