This is my implementation of clean architecture for a golang REST API.
Clean architecture is a highly modular architecture pioneered by Robert C. Martin (Uncle Bob). There are several layers of abstraction for the separation of core business rules from everything else.
It creates a system which is
-
Independent of Frameworks
The architecture does not depend on the existence of some library of feature laden software. This allows you to use such frameworks as tools, rather than having to cram your system into their limited constraints.
-
Testable
The business rules can be tested without the UI, Database, Web Server, or any other external element.
-
Independent of UI
The UI can change easily, without changing the rest of the system. A Web UI could be replaced with a console UI, for example, without changing the business rules.
-
Independent of Database You can swap out Oracle or SQL Server, for Mongo, BigTable, CouchDB, or something else. Your business rules are not bound to the database.
-
Independent of any external agency
In fact your business rules simply don’t know anything at all about the outside world.
-
Entities
Entities are similar to models in MVC. They are an OOPS representation of a real world entity.
-
Use Cases (Repository)
Repository is an abstraction over the entity. It houses the lower level business rules related to database connections. This is independent of the database service used
-
Services
Services are yet another abstraction layer over the application level business rules. This is an interface for higher level business logic oriented functions.
-
Interface Adapters
Each interface has its separate directory. Since we made an API we have an api directory
-
Frameworks and Drivers
In our case, it is Web since this is the layer where all the detials go. In our case, we have implemented handlers for request-response model
See this article on Medium - Clean Architecture, the right way (by Angad Sharma)
DSC VIT's template repo of clean architecute in Go - Go template repository
An implementation for a full fleged rest api and clean code - Bandersnatch by supercmmetry
Another implementation I've referred to while learning this - Clean Notes API by Rithik Jain