code: func diffLists(original, modified []interface{}, t reflect.Type, mergeKey string, ignoreChangesAndAdditions, ignoreDeletions bool) ([]interface{}, error) {
  	if len(original) == 0 {
  		if len(modified) == 0 || ignoreChangesAndAdditions {
  			return nil, nil
  		}
  
  		return modified, nil
  	}
  
  	elementType, err := sliceElementType(original, modified)
  	if err != nil {
  		return nil, err
  	}
  
  	var patch []interface{}
  
  	if elementType.Kind() == reflect.Map {
  		patch, err = diffListsOfMaps(original, modified, t, mergeKey, ignoreChangesAndAdditions, ignoreDeletions)
  	} else if !ignoreChangesAndAdditions {
  		patch, err = diffListsOfScalars(original, modified)
  	}
  
  	if err != nil {
  		return nil, err
  	}
  
  	return patch, nil
  }
docs: // Returns a (recursive) strategic merge patch that yields modified when applied to original,
  // for a pair of lists with merge semantics.