Opinionated example Golang web application with Gin Gonic.
Builds upon https://github.com/RamiAwar/go_demo_users_api.
docker build -t gin-demo:latest .
docker run -p 3000:3000 gin-demo
go mod tidy
go run ./main.go
❯ curl -X POST localhost:3000/v1/dns/find -H 'Content-Type: application/json' -d '{"x": "123.12", "y": "456.56", "z": "789.89", "vel": "20.0"}'
go test ./...
Check out my blog post on backend route design for an in depth dive into the structure: https://softgrade.org/in-depth-guide-to-backend-route-design/
- routes: validation of requests, returning results, handling errors
- services: business logic, should not be concerned whatsoever with how they're used (ex. know nothing about HTTP or context)
- models: request models, response models, and everything in between goes here. Validation + default values are implemented as methods of those models.
- config, app: self explanatory
Passing down context from requests to services is usually very useful. It is true that we want to isolate business logic from usecase, but in the case of web servers this is a very acceptable compromise as the context offers many advantages.