code: func CopyMatchingTag(from interface{}, to interface{}, tag string, shouldCopy func(value string) bool) {
  	fromStruct := reflect.ValueOf(from).Elem()
  	fromType := fromStruct.Type()
  
  	toStruct := reflect.ValueOf(to).Elem()
  	toType := toStruct.Type()
  
  	if fromType != toType {
  		panic(fmt.Sprintf("non equal types: %s != %s", fromType, toType))
  	}
  
  	for i := 0; i < toStruct.NumField(); i++ {
  		fromField := fromStruct.Field(i)
  		toField := toStruct.Field(i)
  
  		if !toField.CanSet() {
  			// Unexported fields
  			continue
  		}
  
  		structTag := toType.Field(i).Tag
  
  		v := structTag.Get(tag)
  		if shouldCopy(v) {
  			toField.Set(fromField)
  		}
  	}
  }
docs: // CopyMatchingTag copies fields tagged tag:"value" from "from" struct onto "to" struct.