SOLID Design Principleas
https://dave.cheney.net/2016/08/20/solid-go-design
S | Single Responsibility Principle (SRP)
Software entities should have one primary responsibility and should have one, and only one, reason to change.
O | Open-Closed Principle (OCP)
Software entities should be open for extension, but closed for modification.
L | Liskov Substitution Principle (LSP)
Liskov substitution principle states, roughly, that two types are substitutable if they exhibit behaviour such that the caller is unable to tell the difference.
I | Interface Segregation Principle (ISP)
Clients should not be forced to depend on methods they do not use.
D | Dependency Inversion Principle (DIP)
High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.