【Go言語】初見のプログラミング言語でWebアプリ開発してみる②

Go-Logo_Aqua

前回はGo言語で作るものを決めて、開発環境を構築しました。

今回は、開発環境を強化していこうと思います。

ホットリロード機能

前回の環境構築では、サーバーサイドのコードを変更したら、毎回コンテナを再起動しなければならなかったので、「air」を使ったホットリロードを試してみようと思います。

docker-compose.yaml

version: '3.8'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
      target: dev // 追加
    volumes:
      - ./:/app
    ports:
      - "8080:8080"
    environment:
      - PORT=8080

Dockerfile

# ★追加 ここから★
FROM golang:1.26.4-alpine3.24 AS dev

# ホットリロード用ツールを追加
RUN go install github.com/air-verse/air@latest

WORKDIR /app

# Goモジュールを取得するためにgo.modとgo.sumをコピー
COPY go.mod go.sum ./
RUN go mod download

# アプリケーションのソースコードをコピー
COPY . .

# 開発時は air で起動
CMD ["air", "-c", ".air.toml"]

# ★追加 ここまで★

FROM golang:1.26.4-alpine3.24 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main ./app

# 実行用の軽量イメージ

FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

# ポート8080を公開
EXPOSE 8080

.air.toml

root = "."
tmp_dir = "tmp"

[build]
cmd = "go build -o ./tmp/main ./app"
bin = "./tmp/main"
full_bin = "./tmp/main"
include_ext = ["go", "tpl", "tmpl", "html"]
exclude_dir = ["assets", "tmp", "vendor", ".git"]
exclude_regex = ["_test.go"]
exclude_unchanged = true
follow_symlink = true

[log]
time = true

[color]
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
clean_on_exit = true

再ビルド・起動

$ docker compose up -d --build
# http://localhost:8080

main.goの修正

package main

import "github.com/gin-gonic/gin"

func main() {
	router := gin.Default()

	router.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "Hello, World2!", // 修正
		})
	})

	router.Run(":8080")
}

リロードしたら無事変わりました!

動作確認の度にコンテナの再ビルドをするのはかなり手間なので、Go言語での開発にはホットリロードは必須ではないでしょうか!?

フォーマッターの設定

/.vscode/settings.json

{
  "[go]": {
    "editor.defaultFormatter": "golang.go",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports": "explicit"
    }
  },
  "go.useLanguageServer": true,
  "gopls": {
    "ui.semanticTokens": true,
    "usePlaceholders": true,
    "completeUnimported": true,
    "staticcheck": true
  },
  "files.exclude": {
    "tmp": true
  },
  "files.watcherExclude": {
    "**/tmp/**": true
  }
}

ソースコードを保存したら自動でイイ感じにフォーマットしてくれるようになりました。AIさん素晴らしい。

フロントエンドの準備

GinはGo言語の有名なフレームワークということで採用してみましたが、APIを提供するバックエンド用で、フロントエンドは別で用意した方が良いようでした。

なので、フロントエンドにNext.js、バックエンドでGinという形で今回は構築してみようと思います。

※本記事はGo言語にフォーカスするため、Next.jsの環境構築や開発についてはふれません。

最低限のGo言語の開発環境構築が完了しました。次回はバックエンドの設計と技術調査を行います。

参考

投稿者プロフィール

KatoShingo
学んだことをアウトプットしていきます!
好きなこと:音楽鑑賞🎵 / ドライブ🚗 / サウナ🧖

関連記事

  1. Go-Logo_Aqua

    【Go言語】初見のプログラミング言語でWebアプリ開発してみる①

最近の記事

  1. Go-Logo_Aqua
  2. 2026.07.09

    AWTF2026の紹介
  3. Go-Logo_Aqua

制作実績一覧

  1. Vivaya
  2. Checkeys