0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Go+Echo+Ent+Air】開発環境構築

Last updated at Posted at 2025-08-22

0.はじめに

スクールの同期がGo言語でアプリ作成したのをきっかけに
自分もGoでアプリを作成しようと思い、
AIと壁打ちした結果、下記技術スタックで開発することに決めました。

言語:Go
フレームワーク:Echo
ORM:Ent
ツール:Air

1.開発環境構築手順

1.1 Goのインストール・セットアップ

Go言語(Golang)とは

Go言語(Golangとも呼ばれます)は、Googleが開発した
オープンソースのプログラミング言語です。
シンプルで効率的なコード記述を重視し、
高いパフォーマンスと並行処理能力を備えているのが特徴です。
Webサービスやシステム開発、クラウド環境、コンテナ技術など、幅広い分野で利用されています。

Go言語の特徴

  • シンプルで読みやすいコード:
    C言語に似た構文を持ちながらも、
    よりシンプルで可読性の高いコード記述を可能にします。
    for文のみを使い、while文やdo/while文がないなど、記述方法が統一されているため、
    複数人で開発する際にもコードのばらつきを抑え、理解しやすくなります。

  • 高速な処理:
    コンパイラ言語であるため、インタプリタ言語に比べて高速な処理が可能です。
    また、ガベージコレクションによる効率的なメモリ管理も特徴です。

  • 並行処理の容易さ:
    「ゴルーチン」と呼ばれる軽量な並行処理機構を備えており、
    並行処理を容易に実現できます。
    これにより、複数の処理を同時に実行し、システムリソースを効率的に活用できます。

  • 豊富なライブラリ:
    Web開発、ネットワークプログラミング、CLIツール開発など、
    幅広い分野をカバーする豊富なライブラリが利用可能です。

goのインストール方法はいくつかありますが、
今回はHomebrewを使ってのインストールとなります。
Homebrewではbrew updateコマンドで
Goのバージョンアップもされる可能性があるので、
バージョン固定したい方はバージョン指定のインストールか
公式ドキュメントにあるパッケージをインストールするのが望ましいです。

# goのインストール
brew install go

# Goのバージョン確認
go version
# 期待される出力: go version go1.24.x [OS]/[arch]

# Go環境の詳細確認
go env
# GOPATH, GOROOT等の設定を確認

# GOPATH の確認
echo $GOPATH  # macOS/Linux
echo %GOPATH%  # Windows

1.2 Goプロジェクト作成

# プロジェクトディレクトリを作成
mkdir my-go-project
cd my-go-project

# ローカル開発向けのシンプルなgo mod初期化
go mod init my-go-project

1.3 Goプロジェクト作成(Echo+Ent+Airインストール)

Echoとは

Echoとは、軽量で高速なGo言語のWebフレームワークです。
特にRESTful API開発で人気があり、
シンプルで使いやすく、高い拡張性と柔軟性を持つことが特徴です。
少ないリソースで効率的に動作し、開発者は短いコードで多くの機能を実装できます。

Echoの特徴

  • 軽量で高速:
    サーバーリソースを効率的に使用し、高いパフォーマンスを発揮します。

  • シンプルで使いやすい:
    直感的なAPIと少ない学習コストで、開発をスムーズに進められます。

  • 高い拡張性:
    豊富なミドルウェアやプラグインを活用して、様々な機能を追加できます。

  • スケーラブル:
    大量のリクエストを効率的に処理でき、
    小規模から大規模なアプリケーションまで対応可能

  • 自動TLSとHTTP/2:
    セキュアな通信と高速なデータ転送をサポートします。
    など

Entとは

Facebook(現Meta)が開発した「エンティティフレームワーク」で、
データベースのスキーマをGoのコードで定義し、
そのスキーマから型安全なクエリやマイグレーションコードを自動生成するORMです。
SQLを直接書かずにGoのコードのみでデータベース操作を行い、
静的型付けによる堅牢な開発と、コード生成による開発工数の大幅な短縮がメリットです。

Entの特徴

  • コード生成ベースのスキーマ管理:
    データベースのスキーマ構造をGoのコードで定義し、
    その定義に基づいてクエリメソッドやマイグレーションコードが自動生成されます。
  • 型安全なクエリ:
    生成されるクエリメソッドはGoの型に依存するため、
    開発中にコンパイルエラーとしてエラーを早期に発見できます。
  • データベース操作の簡略化
    流暢なAPIを提供し、複雑なクエリやリレーション、
    グラフ構造のデータモデルを簡単に扱えます。
  • 静的型付けの強化:
    静的型付けを重視しており、
    ORMとして堅牢なデータモデルの構築をサポートします。
  • 多様なSQL対応:
    MySQL, PostgreSQL, MariaDB, SQLiteといった様々なSQL方言に対応しています。

Airとは

Goアプリケーション開発において、ソースコードの変更を検知して
自動的にビルドと再起動を行うホットリロードツール。
開発者はコードを変更するたびに手動でコンパイルと実行を行う手間が省け、
効率的な開発が可能になります。

# Echoフレームワークのインストール
go get github.com/labstack/echo/v4

# Entのインストール
go get entgo.io/ent/cmd/ent

# Entの初期化
go run entgo.io/ent/cmd/ent new User

# スキーマファイルが ent/schema/user.go に作成されます

ent/schema/user.go の主要フィールド設定例:

// ユーザー基本情報
field.UUID("id", uuid.UUID{})           // プライマリキー(UUID)
field.String("name")                     // ユーザー名
field.String("email").Unique()           // メールアドレス(ユニーク)
field.Bytes("password_hash")             // パスワードハッシュ(暗号化済み)
field.String("profile_image_url")        // プロフィール画像URL
field.Text("bio")                        // 自己紹介文

// 認証関連
field.Bytes("refresh_token_hash")        // リフレッシュトークン
field.Time("refresh_token_expires_at")   // トークン有効期限

// タイムスタンプ
field.Time("created_at")                 // 作成日時
field.Time("updated_at")                 // 更新日時

generate.goの作成

ent/generate.go
package ent

//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema

Entコードの生成

# スキーマからコードを生成
go generate ./ent

以下のファイルが自動生成されます。

  • CRUD操作: Create, Read, Update, Delete
  • クエリビルダー: 複雑な検索条件の構築
  • 型安全な操作: コンパイル時の型チェック

Airインストール:

# インストール
go install github.com/air-verse/air@latest
# air初期化
air init

air.tomlの設定例

# .air.toml
# Air(ホットリロードツール)の設定ファイル

# プロジェクトのルートディレクトリを指定
root = "."
# テストデータディレクトリを指定
testdata_dir = "testdata"
# 一時ファイルの保存ディレクトリを指定
tmp_dir = "tmp"

[build]
  # バイナリ実行時に渡す引数のリスト
  args_bin = []
  # ビルドされたバイナリファイルの出力パス
  bin = "./tmp/main"
  # ビルドコマンドを指定
  cmd = "go build -o ./tmp/main ."
  # ファイル変更検知後、ビルドを開始するまでの遅延時間(ミリ秒)
  delay = 1000
  # 監視対象から除外するディレクトリのリスト
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]
  # 監視対象から除外するファイルのリスト
  exclude_file = []
  # 正規表現で監視対象から除外するファイルパターン
  exclude_regex = ["_test.go"]
  # 変更されていないファイルを除外するかどうか
  exclude_unchanged = false
  # シンボリックリンクをたどるかどうか
  follow_symlink = false
  # フルパスでバイナリを実行する場合のパス
  full_bin = ""
  # 監視対象に含めるディレクトリのリスト
  include_dir = []
  # 監視対象とする拡張子のリスト
  include_ext = ["go", "tpl", "tmpl", "html"]
  # 監視対象に含める特定ファイルのリスト
  include_file = []
  # プロセス終了時の待機時間
  kill_delay = "0s"
  # ビルドエラーログの出力ファイル
  log = "build-errors.log"
  # ポーリングモードを使用するかどうか
  poll = false
  # ポーリング間隔(ミリ秒)
  poll_interval = 0
  # ビルド後に実行するコマンドのリスト
  post_cmd = []
  # ビルド前に実行するコマンドのリスト
  pre_cmd = []
  # 再実行するかどうか
  rerun = false
  # 再実行時の遅延時間(ミリ秒)
  rerun_delay = 500
  # プロセスに割り込み信号を送信するかどうか
  send_interrupt = false
  # エラー時に停止するかどうか
  stop_on_error = false

[color]
  # アプリケーションログの色設定
  app = ""
  # ビルドログの色設定
  build = "yellow"
  # メインログの色設定
  main = "magenta"
  # ランナーログの色設定
  runner = "green"
  # ウォッチャーログの色設定
  watcher = "cyan"

[log]
  # メインプロセスのログのみ表示するかどうか
  main_only = false
  # サイレントモード(ログを表示しない)
  silent = false
  # ログに時刻を表示するかどうか
  time = false

[misc]
  # 終了時に一時ファイルをクリーンアップするかどうか
  clean_on_exit = false

[proxy]
  # アプリケーションポート(0は無効)
  app_port = 0
  # プロキシ機能を有効にするかどうか
  enabled = false
  # プロキシポート(0は無効)
  proxy_port = 0

[screen]
  # リビルド時に画面をクリアするかどうか
  clear_on_rebuild = false
  # スクロール位置を保持するかどうか
  keep_scroll = true

main.goの作成例

package main

import (
    "net/http"
    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

func main() {
    e := echo.New()
    
    // ミドルウェア
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())
    
    // ルート
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    
    // サーバー起動
    e.Logger.Fatal(e.Start(":8080"))
}

1.4 Goプロジェクト実行(airコマンドで実行する)

air

 / /\  | | | |_) 
/_/--\ |_| |_| \_ v1.62.0, built with Go go1.24.5

1.5 Goプロジェクト実行(airコマンドで実行する)

スクリーンショット 2025-08-23 8.49.57.png

1.6 ディレクトリ構成

my-go-project/
├── go.mod                    # Go モジュール定義ファイル
├── go.sum                    # 依存関係のチェックサムファイル
├── main.go                   # メインアプリケーションファイル
├── .air.toml                 # Airの設定ファイル
├── tmp/                      # Airが生成する一時ディレクトリ
│   ├── main                  # ビルドされた実行ファイル
│   └── build-errors.log      # ビルドエラーログ
└── ent/                      # Entが生成するディレクトリ
    ├── generate.go           # Entコード生成用ファイル
    ├── client.go             # Entクライアント
    ├── ent.go                # Entエントリポイント
    ├── mutation.go           # ミューテーション定義
    ├── tx.go                 # トランザクション処理
    ├── user.go               # Userエンティティ
    ├── user_create.go        # User作成クエリ
    ├── user_delete.go        # User削除クエリ
    ├── user_query.go         # User検索クエリ
    ├── user_update.go        # User更新クエリ
    ├── schema/               # スキーマ定義
    │   └── user.go           # Userスキーマ
    ├── migrate/              # マイグレーション関連
    │   ├── migrate.go
    │   └── schema.go
    ├── predicate/            # 条件指定関数
    │   └── predicate.go
    ├── hook/                 # フック関数
    │   └── hook.go
    └── runtime/              # ランタイム関数
        └── runtime.go

2.まとめ

Goに関するプロジェクト作成+シンプルな形での実行〜画面表示までご紹介しました。
今回はEntのスキーマ作成とコード生成までしかご紹介出来ませんでしたが、
いろいろ実装してみて、理解が深まったらEntでの記事作成をしたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?