code: func (v VirtualMachine) FindSnapshot(ctx context.Context, name string) (*types.ManagedObjectReference, error) {
  	var o mo.VirtualMachine
  
  	err := v.Properties(ctx, v.Reference(), []string{"snapshot"}, &o)
  	if err != nil {
  		return nil, err
  	}
  
  	if o.Snapshot == nil || len(o.Snapshot.RootSnapshotList) == 0 {
  		return nil, errors.New("no snapshots for this VM")
  	}
  
  	m := make(snapshotMap)
  	m.add("", o.Snapshot.RootSnapshotList)
  
  	s := m[name]
  	switch len(s) {
  	case 0:
  		return nil, fmt.Errorf("snapshot %q not found", name)
  	case 1:
  		return &s[0], nil
  	default:
  		return nil, fmt.Errorf("%q resolves to %d snapshots", name, len(s))
  	}
  }
docs: // FindSnapshot supports snapshot lookup by name, where name can be:
  // 1) snapshot ManagedObjectReference.Value (unique)
  // 2) snapshot name (may not be unique)
  // 3) snapshot tree path (may not be unique)