Removing Array Element of Struct in Go
When working with arrays of structs in Go, it may be necessary to remove an element based on a specific condition. However, attempting to do this within a loop can lead to "out of range" errors.
Consider the following example:
type Config struct { Applications []Application } // config is initialized from a JSON file config = new(Config) _ = decoder.Decode(&config) for i, application := range config.Applications { if i == 1 { config.Applications = _removeApplication(i, config.Applications) } } func _removeApplication(i int, list []Application) []Application { if i < len(list)-1 { list = append(list[:i], list[i+1:]...) } else { log.Print(list[i].Name) list = list[:i] } return list }
This code attempts to remove the second element (index 1) from the array of Applications. However, deleting elements in this loop, especially if the current element is deleted, can result in erroneous indexing due to the shift in element positions after deletion.
Recommended Solution
To avoid indexing issues, it is advised to loop in reverse order:
for i := len(config.Applications) - 1; i >= 0; i-- { application := config.Applications[i] // Condition to decide if current element has to be deleted: if haveToDelete { config.Applications = append(config.Applications[:i], config.Applications[i+1:]...) } }
This downward loop ensures that the elements after the one being deleted are shifted properly, preventing any out-of-range issues.
The above is the detailed content of How to Safely Remove Elements from an Array of Structs in Go?. For more information, please follow other related articles on the PHP Chinese website!