APIの実装やブロックチェーン系のプロジェクトで
Goが現場で使われてるのを良く見るようになりました。
入門しましょう。ChatGPTに書かせます。
プロジェクトディレクトリと必要なファイルを作成
以下の構造でプロジェクトディレクトリを作成します:
mkdir -p go-todo-api
cd go-todo-api
mkdir db
touch docker-compose.yml
touch db/init.sql
touch main.goDocker 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コマンドを使用してアプリケーションを再びビルドおよび実行します。
