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
包是两个非常好的例子。