code: func (d *ResourceDiff) ForceNew(key string) error {
  	if !d.HasChange(key) {
  		return fmt.Errorf("ForceNew: No changes for %s", key)
  	}
  
  	keyParts := strings.Split(key, ".")
  	var schema *Schema
  	schemaL := addrToSchema(keyParts, d.schema)
  	if len(schemaL) > 0 {
  		schema = schemaL[len(schemaL)-1]
  	} else {
  		return fmt.Errorf("ForceNew: %s is not a valid key", key)
  	}
  
  	schema.ForceNew = true
  
  	// Flag this for a re-diff. Don't save any values to guarantee that existing
  	// diffs aren't messed with, as this gets messy when dealing with complex
  	// structures, zero values, etc.
  	d.forcedNewKeys[keyParts[0]] = true
  
  	return nil
  }
docs: // ForceNew force-flags ForceNew in the schema for a specific key, and
  // re-calculates its diff, effectively causing this attribute to force a new
  // resource.
  //
  // Keep in mind that forcing a new resource will force a second run of the
  // resource's CustomizeDiff function (with a new ResourceDiff) once the current
  // one has completed. This second run is performed without state. This behavior
  // will be the same as if a new resource is being created and is performed to
  // ensure that the diff looks like the diff for a new resource as much as
  // possible. CustomizeDiff should expect such a scenario and act correctly.
  //
  // This function is a no-op/error if there is no diff.
  //
  // Note that the change to schema is permanent for the lifecycle of this
  // specific ResourceDiff instance.