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"`
}
Im trying to understand why the same object is showing as two different types?
不是。
I believed Ds.Info to be of the VmfsDatastoreInfo type
没有。如果 ds
是 Datastore
,那么 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/kgDYXv4i63T。
reflect.TypeOf
在其参数(即 interface {}
) 内部查找;如果它不总是报告静态类型,reflect.TypeOf 将总是报告 interface{}
).
可能你应该只使用没有反射的接口:
ds.Info.GetDatastoreInfo()
并使用该信息。这里不用反映了。
背景: 我正在使用 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"`
}
Im trying to understand why the same object is showing as two different types?
不是。
I believed Ds.Info to be of the VmfsDatastoreInfo type
没有。如果 ds
是 Datastore
,那么 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/kgDYXv4i63T。
reflect.TypeOf
在其参数(即 interface {}
) 内部查找;如果它不总是报告静态类型,reflect.TypeOf 将总是报告 interface{}
).
可能你应该只使用没有反射的接口:
ds.Info.GetDatastoreInfo()
并使用该信息。这里不用反映了。