Maybe a simple []string and strings.Join would be nicer here? You wouldn't allocate as many new strings, you wouldn't have the overhead of reflection and the code would be more straightforward to understand, by not having the "is it initialized yet?" check on every iteration.

```go
errors := []string{"The following errors..."}
for ... {
  // append if error
}

if len(errors) > 1 {
  return errors.New(strings.Join(errors, "\n"))
}
```