DEV Community

Permpoon Chao
Permpoon Chao

Posted on • Updated on

Go project structures

source & credit : thank you Kat Zień
video
repository

Goals

  • Consistent เพื่อให้โครงสร้างทุกส่วนของไปในทิศทางเดียวกัน
  • Easy to understand
  • Easy to change, loosely-coupled แก้ไขง่าย โดยไม่กระทบส่วนอื่น ๆ
  • East to test
  • Structure reflects the design exactly

Example

Beer reviewing service

Requirements

  1. Users can add a beer
  2. Users can add a review for a beer
  3. Users can list all beers
  4. Users can list all reviews for a selected beer.
  5. Option to store data either in memory or JSON file
  6. Ability to add some sample data

Flat structure

📦/
┣ 📜data.go
┣ 📜handlers.go
┣ 📜main.go
┣ 📜model.go
┣ 📜storage.go
┣ 📜storage_json.go
┣ 📜storage_mem.go
┗ 📜[file name]_test.go

main.go

  • Get storage [Requirement 5]
  • Call for routes to get service
  • Mock data [Requirement 6]
  • HTTP server listener

handlers.go

  • Manage with request (header, body, params,etc...)
  • Call data from storage

model.go

  • Entities struct

image


Group by function (Layered archetecture)

  • presentation / ui
  • business logic
  • external deps / infrastructure

📦/
┣ 📜data.go
┣ 📂handlers
┃ ┣ 📜beers.go
┃ ┗ 📜reviews.go
┣ 📂models
┃ ┣ 📜beer.go
┃ ┣ 📜review.go
┃ ┗ 📜storage.go
┗ 📂storage
┣ 📜json.go
┗ 📜memory.go

main.go

  • Call for routes to get service

handlers

  • request / response manage
  • get storage

storage

  • database services
    • struct
    • methods [ CRUD ]

Cons

เสี่ยงต่อการเกิด Circular dependencies สูง เช่น layer models ต้องถูกใช้งานจากทั้ง layer บน และ ล่าง


Group by module

📦/
┣ 📜main.go
┣ 📂beers
┃ ┣ 📜beer.go
┃ ┗ 📜handler.go
┣ 📂reviews
┃ ┣ 📜review.go
┃ ┣ 📜handler.go
┗ 📂storage
┣ 📜json.go
┣ 📜data.go
┣ 📜memory.go
┗ 📜storage.go

Cons

เสี่ยงต่อการเกิด Circular dependencies เนื่องจาก ข้อมูลมีการเชื่อมโยงกัน [Requirement 2, 4]

  • Beer ก็ใช้งาน Review
  • Review ก็ใช้งาน Beer

Group by context

Domain Driven Design

  • Estalish your domain and business logic
  • Define your bounded contexts, the models within each context and the ubiquitous language
  • Catagorising the building blocks of your system

Building blocks

  • Context beer tasting
  • Language beer, review, storage
  • Entities Beer, Review
  • Value Objects Brewery, Author
  • Aggregate Beer Reviewer
  • Service Beer adder / adding, Beer lister / listing, Review lister
  • Events Beer added, Review added, Beer already exists, Beer not found
  • Repository Beer repository, Review repository

📦/
┣ 📂adding
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂beers
┃ ┣ 📜beer.go
┃ ┗ 📜sample_beers.go
┣ 📂listing
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂reviewing
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂reviews
┃ ┣ 📜review.go
┃ ┗ 📜sample_reviews.go
┣ 📂storage
┃ ┣ 📜json.go
┃ ┣ 📜type.go
┃ ┗ 📜memory.go
┗ 📜main.go

mermaid-diagram-20210417094134


Hexagonal Architecture

📦/
┣ 📂cmd
┃ ┣ 📂beer-server
┃ ┃ ┗ 📜main.go
┃ ┗ 📂sample-data
┃ ┗ 📜main.go
┗ 📂pkg
┣ 📂adding
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂beers
┃ ┗ 📜beer.go
┣ 📂listing
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂reviewing
┃ ┣ 📜endpoint.go
┃ ┗ 📜service.go
┣ 📂reviews
┃ ┗ 📜review.go
┣ 📂storage
┃ ┣ 📜json.go
┃ ┣ 📜type.go
┃ ┗ 📜memory.go
┣ 📂http
┃ ┣ 📂rest
┃ ┃ ┗ 📜handler.go
┃ ┣ 📂soap
┃ ┗ 📂rpc
┣ 📂resources
┃ ┗ 📂sample-data
┃ ┣ 📜sample_beers.go
┃ ┗ 📜sample_reviews.go

cmd

  • commands to use service
    • use by request http protocal
    • use by using command line

resources/sample-data

  • seperate sample data to individual folder

Top comments (2)

Collapse
 
bias profile image
Tobias Nickel

hi, this is very cool, thanks, and also that the repo is there to see what is inside each file.

I see the repo is like 3 years old. do you think it would need some update? Does it reflect go-modules? and some internal directory?

I can not really judge that as I do not actively code using go for the last 2 years.

Collapse
 
mossnana profile image
Permpoon Chao

Thank you :)

I think repository's owner may make requirements easy to understand and no encapsulation concept for internal directory.

P.S. I just started code with go for 6 months. I apologize if there are any mistakes.

:)