code: func Clone(c *govmomi.Client, src *object.VirtualMachine, f *object.Folder, name string, spec types.VirtualMachineCloneSpec, timeout int) (*object.VirtualMachine, error) {
  	log.Printf("[DEBUG] Cloning virtual machine %q", fmt.Sprintf("%s/%s", f.InventoryPath, name))
  	ctx, cancel := context.WithTimeout(context.Background(), time.Minute*time.Duration(timeout))
  	defer cancel()
  	task, err := src.Clone(ctx, f, name, spec)
  	if err != nil {
  		if ctx.Err() == context.DeadlineExceeded {
  			err = errors.New("timeout waiting for clone to complete")
  		}
  		return nil, err
  	}
  	result, err := task.WaitForResult(ctx, nil)
  	if err != nil {
  		if ctx.Err() == context.DeadlineExceeded {
  			err = errors.New("timeout waiting for clone to complete")
  		}
  		return nil, err
  	}
  	log.Printf("[DEBUG] Virtual machine %q: clone complete (MOID: %q)", fmt.Sprintf("%s/%s", f.InventoryPath, name), result.Result.(types.ManagedObjectReference).Value)
  	return FromMOID(c, result.Result.(types.ManagedObjectReference).Value)
  }
docs: // Clone wraps the creation of a virtual machine and the subsequent waiting of
  // the task. A higher-level virtual machine object is returned.