【问题标题】:Type assertion in go在 go 中键入断言
【发布时间】:2017-02-09 00:32:09
【问题描述】:

我有这个代码sn-p:

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)
}

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

【问题讨论】:

    标签: go interface type-assertion


    【解决方案1】:

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

    【讨论】:

    • @mario-stoilov,我同意:您应该尽可能避免使用 reflect 包。大多数时候使用它表明代码异味是唯一真正需要它的情况是当您使用(用户提供的)类型时,您事先完全一无所知,并且必须在运行时检查它们的结构。 encoding/xmlencoding/json 包就是两个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2016-05-26
    • 2021-02-10
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多