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の作成
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コマンドで実行する)
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での記事作成をしたいと思います。
