code: func DiskDestroyOperation(d *schema.ResourceData, c *govmomi.Client, l object.VirtualDeviceList) ([]types.BaseVirtualDeviceConfigSpec, error) {
  	log.Printf("[DEBUG] DiskDestroyOperation: Beginning destroy")
  	// All we are doing here is getting a config spec for detaching the disks
  	// that we need to detach, so we don't need the vast majority of the stateful
  	// logic that is in deviceApplyOperation.
  	ds := d.Get(subresourceTypeDisk).([]interface{})
  
  	var spec []types.BaseVirtualDeviceConfigSpec
  
  	log.Printf("[DEBUG] DiskDestroyOperation: Detaching devices with keep_on_remove enabled")
  	for oi, oe := range ds {
  		m := oe.(map[string]interface{})
  		if !m["keep_on_remove"].(bool) && !m["attach"].(bool) {
  			// We don't care about disks we haven't set to keep
  			continue
  		}
  		r := NewDiskSubresource(c, d, m, nil, oi)
  		dspec, err := r.Delete(l)
  		if err != nil {
  			return nil, fmt.Errorf("%s: %s", r.Addr(), err)
  		}
  		l = applyDeviceChange(l, dspec)
  		spec = append(spec, dspec...)
  	}
  
  	log.Printf("[DEBUG] DiskDestroyOperation: Device config operations from destroy: %s", DeviceChangeString(spec))
  	return spec, nil
  }
docs: // DiskDestroyOperation process the destroy operation for virtual disks.
  //
  // Disks are the only real operation that require special destroy logic, and
  // that's because we want to check to make sure that we detach any disks that
  // need to be simply detached (not deleted) before we destroy the entire
  // virtual machine, as that would take those disks with it.