APIの実装やブロックチェーン系のプロジェクトで
Goが現場で使われてるのを良く見るようになりました。
入門しましょう。ChatGPTに書かせます。
プロジェクトディレクトリと必要なファイルを作成
以下の構造でプロジェクトディレクトリを作成します:
mkdir -p go-todo-api
cd go-todo-api
mkdir db
touch docker-compose.yml
touch db/init.sql
touch main.go
Docker Compose ファイルの作成
docker-compose.yml
ファイルに以下の内容を記述します:
version: '3.8'
services:
app:
image: golang:1.17
volumes:
- .:/go/src/go-todo-api
working_dir: /go/src/go-todo-api
command: go run main.go
depends_on:
- db
environment:
DB_SOURCE: postgres://user:password@db:5432/tododb?sslmode=disable
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: tododb
volumes:
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
Go のアプリケーションの作成
main.go
ファイルを以下のように記述します:
package main
import (
"database/sql"
"fmt"
"log"
"net/http"
"os"
"github.com/gin-gonic/gin"
_ "github.com/lib/pq"
)
var db *sql.DB
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Status bool `json:"status"`
}
func main() {
var err error
dbSource := os.Getenv("DB_SOURCE")
if dbSource == "" {
log.Fatal("DB_SOURCE must be set")
}
db, err = sql.Open("postgres", dbSource)
if err != nil {
log.Fatalf("Failed to connect to db: %v", err)
}
router := gin.Default()
router.GET("/todos", getTodos)
router.POST("/todos", createTodo)
router.GET("/todos/:id", getTodo)
router.PUT("/todos/:id", updateTodo)
router.DELETE("/todos/:id", deleteTodo)
router.Run(":8080")
}
// 以下の部分に getTodos, createTodo, getTodo, updateTodo, および deleteTodo のハンドラ関数を定義します
データベースのスキーマの定義
db/init.sql
ファイルに以下の SQL コマンドを追加してデータベースのスキーマを定義します:
CREATE TABLE IF NOT EXISTS todos (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
status BOOLEAN NOT NULL DEFAULT FALSE
);
Go のパッケージのインストール
プロジェクトディレクトリで以下のコマンドを実行して必要な Go のパッケージをインストールします:
go mod init go-todo-api
go get github.com/gin-gonic/gin
go get github.com/lib/pq
アプリケーションのビルドと実行
プロジェクトディレクトリで以下のコマンドを実行してアプリケーションをビルドおよび実行します:
docker-compose up --build
これでアプリケーションが起動し、REST APIがhttp://localhost:8080/todos
で利用可能になります。
REST APIエンドポイントの実装
main.go
ファイルにgetTodos
, createTodo
, getTodo
, updateTodo
, および deleteTodo
ハンドラ関数を実装します。 上記の main.go
ファイルのプレースホルダー部分を完成させるために、各ハンドラ関数を実装します。
注意: ここでは SQL クエリが直接文字列としてハードコードされていますが、プロダクション環境では SQL インジェクションを防ぐためにパラメータ化されたクエリを使用するべきです。
一度すべてのエンドポイントが実装されたら、docker-compose up --build
コマンドを使用してアプリケーションを再びビルドおよび実行します。