code: func (mr *modelRef) mainHashArgsForFields(fieldNames []string) (redis.Args, error) {
  	args := redis.Args{mr.key()}
  	ms := mr.spec
  	for _, fs := range ms.fields {
  		// Skip fields whose names do not appear in fieldNames.
  		if !stringSliceContains(fieldNames, fs.name) {
  			continue
  		}
  		fieldVal := mr.fieldValue(fs.name)
  		switch fs.kind {
  		case primativeField:
  			// Add a special case for time.Duration. By default, the redigo driver
  			// will fall back to fmt.Sprintf, but we want to save it as an int64 in
  			// this case.
  			if fs.typ == reflect.TypeOf(time.Duration(0)) {
  				args = args.Add(fs.redisName, int64(fieldVal.Interface().(time.Duration)))
  			} else {
  				args = args.Add(fs.redisName, fieldVal.Interface())
  			}
  		case pointerField:
  			if !fieldVal.IsNil() {
  				args = args.Add(fs.redisName, fieldVal.Elem().Interface())
  			} else {
  				args = args.Add(fs.redisName, "NULL")
  			}
  		case inconvertibleField:
  			switch fieldVal.Type().Kind() {
  			// For nilable types that are nil store NULL
  			case reflect.Ptr, reflect.Slice, reflect.Map, reflect.Interface:
  				if fieldVal.IsNil() {
  					args = args.Add(fs.redisName, "NULL")
  					continue
  				}
  			}
  			// For inconvertibles, that are not nil, convert the value to bytes
  			// using the gob package.
  			valBytes, err := mr.spec.fallback.Marshal(fieldVal.Interface())
  			if err != nil {
  				return nil, err
  			}
  			args = args.Add(fs.redisName, valBytes)
  		}
  	}
  	return args, nil
  }
docs: // mainHashArgsForFields is like mainHashArgs but only returns the hash
  // fields which match the given fieldNames.