現場で使いそうなので、GoのAPI入門する

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コマンドを使用してアプリケーションを再びビルドおよび実行します。