vsphere/internal/virtualdevice/virtual_machine_device_subresource.go
func DeviceChangeString(specs []types.BaseVirtualDeviceConfigSpec) string {
	var strs []string
	for _, v := range specs {
		spec := v.GetVirtualDeviceConfigSpec()
		strs = append(strs, fmt.Sprintf("(%s: %T at key %d)", string(spec.Operation), spec.Device, spec.Device.GetVirtualDevice().Key))
	}
	return strings.Join(strs, ",")
}
func DeviceChangeString(specs []types.BaseVirtualDeviceConfigSpec) string {
	var strs []string
	for _, v := range specs {
		spec := v.GetVirtualDeviceConfigSpec()
		strs = append(strs, fmt.Sprintf("(%s: %T at key %d)", string(spec.Operation), spec.Device, spec.Device.GetVirtualDevice().Key))
	}
	return strings.Join(strs, ",")
}
// DeviceChangeString pretty-prints a slice of VirtualDeviceConfigSpec.