DEV Community

Perm Chao
Perm Chao

Posted on

Initial API project with Go

เกริ่นนำ

เนื่องจากช่วงนี้ผมได้มาเริ่มต้นโปรเจค API ด้วย Golang บ่อย
ผมเลยขอบันทึกไว้กันลืม

Stack

1) Golang
2) Go Fiber
3) Gorm
4) PostgreSQL

Steps

1) สร้าง Folder สำหรับที่อยู่ของโปรเจค

$ mkdir demo $ cd demo 
Enter fullscreen mode Exit fullscreen mode

2) สร้าง go mod file

$ go mod init github.com/mossnana/demo 
Enter fullscreen mode Exit fullscreen mode

3) สร้าง Folders / Files ที่เก็บ source code

$ mkdir cmd $ mkdir internal $ mkdir pkg 
Enter fullscreen mode Exit fullscreen mode

** Folder **

  • cmd ไว้วางโฟรเดอร์ที่มีไฟล์ main.go สำหรับโปรแกรมต่าง ๆ เช่น
    • server ตัว run web server
    • migrator ตัว migrate db
  • internal ไว้ใส่ไฟล์ที่เก็บ logic ที่เกี่ยวข้องกับตัว api นี้ ที่มีความเฉพาะตัวของ api นี้
  • pkg ไว้เก็บไฟล์ที่ไว้ต่อกับโปรแกรมนอก เช่น function ต่อ database ๆลๆ

4) สร้าง Folders / Files ที่ไว้ run
Dockerfile

FROM golang:latest WORKDIR /app COPY . . RUN go mod tidy RUN go get github.com/githubnemo/CompileDaemon RUN go build -o bin/migrator ./cmd/migrator CMD CompileDaemon --build="go build -o bin/server ./cmd/server" --command="./bin/server" 
Enter fullscreen mode Exit fullscreen mode
  • CompileDaemon ใช้เป็นตัว auto restart เมื่อ code เปลี่ยน

docker-compose.yml

version: "3.5" services: demo_service: container_name: demo_service build: context: . dockerfile: Dockerfile volumes: - ./:/app restart: always ports: - "3000:3000" networks: - demo_net env_file: - ./.env brij_db: container_name: brij_db image: postgres:14 volumes: - "demo_db_data:/var/lib/postgresql/data" ports: - "5432:5432" environment: - POSTGRES_USER=demo - POSTGRES_PASSWORD=demopassword - POSTGRES_DB=demo networks: - demo_net networks: demo_net: external: false volumes: demo_db_data: external: false 
Enter fullscreen mode Exit fullscreen mode

Makefile

build: docker-compose up -d --build start: docker-compose up -d migrate: docker exec -it demo_service /app/bin/migrator stop: docker-compose down 
Enter fullscreen mode Exit fullscreen mode

Project tree

. ├── cmd/ │ ├── demo/ │ │ └── main.go │ └── migrator/ │ └── main.go ├── internal/ │ ├── model/ │ │ ├── sale.go │ │ ├── purchase.go │ │ └── account.go │ ├── repository/ │ │ ├── sale.go │ │ ├── purchase.go │ │ └── account.go │ ├── service/ │ │ ├── sale/ │ │ │ ├── v1/ │ │ │ │ ├── create.go │ │ │ │ ├── read.go │ │ │ │ ├── update.go │ │ │ │ └── delete.go │ │ │ └── v2/ │ │ │ ├── create.go │ │ │ ├── read.go │ │ │ ├── update.go │ │ │ └── delete.go │ │ └── ... │ ├── handler/ │ │ └── sale/ │ │ ├── v1/ │ │ │ ├── create.go │ │ │ ├── read.go │ │ │ ├── update.go │ │ │ └── delete.go │ │ ├── v2/ │ │ │ ├── create.go │ │ │ ├── read.go │ │ │ ├── update.go │ │ │ └── delete.go │ │ └── ... │ └── route/ │ ├── sale.go │ ├── purchase.go │ └── account.go ├── pkg/ │ ├── auth/ │ │ └── auth.go │ └── gorm/ │ ├── driver.go │ └── migrate.go ├── Dockerfile ├── docker-compose.yml └── Makefile 
Enter fullscreen mode Exit fullscreen mode

การ Build

go build -o bin/{{ชื่อแอปใน main}} ./cmd/{{ชื่อแอปใน main}} 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)