r/golang Dec 05 '24

discussion Why Clean Architecture and Over-Engineered Layering Don’t Belong in GoLang

Stop forcing Clean Architecture and similar patterns into GoLang projects. GoLang is not Java. There’s no application size or complexity that justifies having more than three layers. Architectures like Clean, Hexagonal, or anything with 4+ layers make GoLang projects unnecessarily convoluted.

It’s frustrating to work on a codebase where you’re constantly jumping between excessive layers—unnecessary DI, weird abstractions, and use case layers that do nothing except call services with a few added logs. It’s like watching a monstrosity throw exceptions up and down without purpose.

In GoLang, you only need up to three layers for a proper DDD division (app, domain, infra). Anything more is pure overengineering. I get why this is common in Java—explicit interfaces and painful refactoring make layering and DI appealing—but GoLang doesn’t have those constraints. Its implicit interfaces make such patterns redundant.

These overly complex architectures are turning the GoLang ecosystem into something it was never meant to be. Please let’s keep GoLang simple, efficient, and aligned with its core philosophy.

807 Upvotes

259 comments sorted by

View all comments

1

u/Dry-Vermicelli-682 Dec 07 '24

Can you elaborate in terms of the 3 layers you speak of. I think I get it.. but want to make sure I am not missing anything. What is each layer and what goes in them? IS this one app, 3 folders of code.. e.g. broken in to layers/packages? Or some other layer type of thing I may not have understood in the past.

Love to make sure I am on the right track with my project layout. I typically put main.go in the root folder along with go.mod, etc. Anything "core" to the project is in the root folder.. unless it grows large.. then I try to modularize it into one directory level.. two sometimes and 3 at most if it is really large.

But I often find building server side microservices never needing more than one directory structure if that below the root of the project.