I've never worked in a large codebase that did this manually so I'm not sure what it looks like. The large codebases I've seen that don't use DI have used something like a service locator, singletons, or constructed everything where it was needed (and used extensive mocking framework functionality for testing).
Manual DI reveals problems like this way earlier.
DI frameworks, IMO, are some of the most useless around. Solution seeking a problem.
If it's 5000 lines and messy it is indeed a problem, but only because it's messy.
If you really want to use DI in golang, for some reason, wire[1] at least still gives you type safety and compile-time failures.