Reflect showing different a different type than 错误

Reflect showing different a different type than error

背景: 我正在使用 govmomi 收集 vmware 的配置。我目前正在获取我需要的数据存储信息。我需要的字段之一是磁盘 Naa。这可以在 Vmfs 字段下的 VmfsDatastoreInfo 结构中找到。

问题: 我正在遍历一个范围,我相信 Ds.Info 属于 VmfsDatastoreInfo 类型,所以理论上我可以通过遍历获得我需要的信息Ds.Info.Vmfs。当我引用这个时,我得到错误:

ds.Info.Vmfs undefined (type types.BaseDatastoreInfo has no field or method Vmfs)

出于好奇,我使用反射进行了探索并执行了以下操作:

fmt.Println(reflect.TypeOf(ds.Info))

输出为

*types.VmfsDatastoreInfo

我想了解为什么同一个对象显示为两种不同的类型?

编辑: 前往 ds :

c, err := govmomi.NewClient(ctx, u, true)

//Check if the connection was successful
if err != nil {
    fmt.Println(err)
}

// Create view of Datastore objects
m := view.NewManager(c.Client)

d, _ := m.CreateContainerView(ctx, c.ServiceContent.RootFolder, []string{"Datastore"}, true)



if err != nil {
    log.Fatal(err)
}

defer d.Destroy(ctx)

//Retrieve a list of all Virtual Machines including their summary and runtime
var dss []mo.Datastore
err = d.Retrieve(ctx, []string{"Datastore"}, []string{"info", "host"}, &dss)
if err != nil {
    log.Fatal(err)
}


for _, ds := range dss {
    fmt.Println(reflect.TypeOf(ds.Info))
    s := reflect.ValueOf(ds.Info).Elem()

    typeOfT := s.Type()

    for i := 0; i < s.NumField(); i++ {

    f := s.Field(i)

    fmt.Println(i, typeOfT.Field(i).Name, f.Type(), f.Interface())

    }

}

ds 是数据存储类型:

type Datastore struct {
    ManagedEntity

    Info              types.BaseDatastoreInfo        `mo:"info"`
    Summary           types.DatastoreSummary         `mo:"summary"`
    Host              []types.DatastoreHostMount     `mo:"host"`
    Vm                []types.ManagedObjectReference `mo:"vm"`
    Browser           types.ManagedObjectReference   `mo:"browser"`
    Capability        types.DatastoreCapability      `mo:"capability"`
    IormConfiguration *types.StorageIORMInfo         `mo:"iormConfiguration"`
}

根据 Govmomi 软件包信息,我发现了以下内容

type BaseDatastoreInfo interface {
    GetDatastoreInfo() *DatastoreInfo
}

func (b *DatastoreInfo) GetDatastoreInfo() *DatastoreInfo

type DatastoreInfo struct {
    DynamicData

    Name                   string     `xml:"name"`
    Url                    string     `xml:"url"`
    FreeSpace              int64      `xml:"freeSpace"`
    MaxFileSize            int64      `xml:"maxFileSize"`
    MaxVirtualDiskCapacity int64      `xml:"maxVirtualDiskCapacity,omitempty"`
    MaxMemoryFileSize      int64      `xml:"maxMemoryFileSize,omitempty"`
    Timestamp              *time.Time `xml:"timestamp"`
    ContainerId            string     `xml:"containerId,omitempty"`
}

Govmomi Struct Info

Im trying to understand why the same object is showing as two different types?

不是。

I believed Ds.Info to be of the VmfsDatastoreInfo type

没有。如果 dsDatastore,那么 ds.Info 是类型 BaseDatastoreInfo,它是一个接口,因此只有一个方法 GetDatastoreInfo()。这就是您看到错误

的原因
ds.Info.Vmfs undefined (type types.BaseDatastoreInfo has no field or method Vmfs)

现在阅读包 reflect 的整个包文档和 reflect.TypoOf 的文档。现在阅读 https://blog.golang.org/laws-of-reflection.

您的 reflect.TypeOf(ds.Info) 解析了 ds.Info 的动态类型(它的静态类型是 BaseDatastoreInfo)。有关简单示例,请参阅 https://play.golang.org/p/kgDYXv4i63Treflect.TypeOf 在其参数(即 interface {} 内部查找;如果它不总是报告静态类型,reflect.TypeOf 将总是报告 interface{}).

可能你应该只使用没有反射的接口:

ds.Info.GetDatastoreInfo()

并使用该信息。这里不用反映了。