Go言語でWeb開発を始める前に知っておきたいこと
「自社の業務に合ったシステムが欲しいが、既存のSaaSでは機能が合わない」「外注すると高額で、小さな修正も都度費用がかかる」——こうした課題を抱える中小企業のIT担当者にとって、Go言語は有力な選択肢です。
Go言語(Golang)は、シンプルで学びやすく、高速に動作するため、小規模なチームでも「ちょうどいい」Webシステムを構築できます。完璧なエンジニアになる必要はありません。必要な機能だけを理解し、小さく始めることで、属人化を防ぎ、業務効率化を実現できます。
Go言語がWeb開発で選ばれる理由
Go言語は、Googleが開発したプログラミング言語で、Web開発の現場で急速に採用が広がっています。その理由は主に3つです。
1. 圧倒的な処理速度
コンパイル型言語のため、PHPやPythonといったスクリプト言語と比較すると、数倍から数十倍の速度で処理できます。顧客管理システムや予約システムなど、データ処理が多い業務システムでも快適に動作します。
2. シンプルで読みやすい文法
文法が非常にシンプルで、覚えることが少ないのが特徴です。誰が書いても似たコードになるため、属人化を防ぎ、後任者への引き継ぎがスムーズになります。
3. 並行処理が得意
複数の処理を同時に実行する並行処理が言語レベルでサポートされています。複数ユーザーからの同時アクセスや、メール送信などのバックグラウンド処理を効率的に実装でき、小規模なサーバーでも多くのリクエストを捌けます。
他の言語との比較
Web開発でよく使われる言語と比較すると、Go言語の立ち位置が明確になります。
-
PHP:WordPressなどで広く使われますが、言語仕様が複雑で書き方が統一されにくい傾向があります。Goは文法がシンプルで、チーム開発や引き継ぎに有利です。
-
Python:機械学習やデータ分析では強力ですが、Web開発における実行速度ではGoに劣ります。リアルタイム性が求められる業務システムではGoが適しています。
-
Node.js:高速ですが、非同期処理の概念が初心者には難しく感じられることがあります。Goは並行処理の記述がシンプルで、直感的に理解しやすい設計です。
Go言語が適している開発ケース
Go言語は、特に以下のようなケースで威力を発揮します。
Excel管理から脱却したい業務システム
顧客情報や案件情報をExcelで管理していると、複数人での同時編集や検索性に課題が出ます。GoでシンプルなWeb管理システムを構築すれば、ブラウザからアクセスでき、データの一元管理が可能になります。
既存SaaSでは機能が合わない場合
多機能なSaaSは便利ですが、自社の業務フローに完全に合わないことも多く、月額費用も積み重なります。必要な機能だけを持った「ちょうどいい」システムをGoで作れば、長期的なコスト削減につながります。
スマホアプリのバックエンドAPI
スマホアプリを開発する際、データを管理するバックエンドシステムが必要です。GoはAPIの構築が得意で、高速なレスポンスを提供できます。
社内ツールの内製化
予約管理、タスク管理、見積・請求システムなど、社内の小さな業務を効率化するツールは、大規模な開発は不要です。Goなら短期間で実装でき、運用コストも抑えられます。
Go言語の開発環境を準備しよう
プログラミングを始める第一歩は、開発環境の構築です。Go言語は環境構築が非常にシンプルで、初心者でも迷いにくい設計になっています。
Goのインストール方法
Windowsの場合
公式サイト(https://go.dev/dl/)から「Microsoft Windows」用のインストーラー(.msiファイル)をダウンロードし、実行します。インストール先はデフォルト(C:\Program Files\Go)のままで問題ありません。
Macの場合
Homebrewを使う方法が最も簡単です。ターミナルで以下を実行します。
brew install go
Linuxの場合(Ubuntu/Debian系)
wget https://go.dev/dl/go1.21.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
インストール後、バージョン確認をします。
go version
バージョン情報が表示されれば、インストール成功です。
VS Codeのセットアップ
Go言語の開発には、Visual Studio Code(VS Code)が最もおすすめです。無料で、拡張機能が豊富、動作も軽快です。
- 公式サイト(https://code.visualstudio.com/)からダウンロードしてインストール
- VS Codeの拡張機能から「Go(Go Team at Google提供)」をインストール
この拡張機能により、コード補完、エラー検出、自動フォーマット、デバッグ機能が使えるようになります。
Hello Worldを動かしてみる
実際にプログラムを動かしてみましょう。
1. プロジェクトフォルダの作成
mkdir hello-go
cd hello-go
go mod init hello-go
2. main.goファイルの作成
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
3. プログラムの実行
go run main.go
「Hello, World!」と表示されれば成功です。
よく使うGoコマンド
| コマンド | 用途 |
|---|---|
go run |
ファイルを実行 |
go build |
実行ファイルを生成 |
go mod init |
モジュール初期化 |
go mod tidy |
不要な依存を削除 |
go get |
パッケージをインストール |
go fmt |
コードを整形 |
Go言語の基本文法
Web開発で実際に使う部分に絞って学ぶことで、効率的にスキルアップできます。
変数とデータ型
Go言語では、変数を宣言する方法が複数あります。
// 短縮記法(関数内で最もよく使う)
name := "山田太郎"
age := 30
// 定数の宣言
const CompanyName = "Harmonic Society"
よく使うデータ型
string:文字列int:整数float64:小数bool:真偽値[]string:文字列の配列
関数の書き方
関数は、処理をまとめて再利用可能にする仕組みです。
func greet(name string) string {
return "こんにちは、" + name + "さん"
}
複数の戻り値を返す
Go言語の特徴的な機能として、複数の値を返せます。エラー処理でよく使われます。
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("ゼロで割ることはできません")
}
return a / b, nil
}
構造体とJSON変換
構造体は、複数のデータをまとめて扱うための仕組みです。
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
func main() {
user := User{ID: 1, Name: "山田太郎", Email: "yamada@example.com"}
// 構造体 → JSON
jsonData, _ := json.Marshal(user)
fmt.Println(string(jsonData))
}
エラーハンドリング
Go言語では、エラーを戻り値として返す方式を採用しています。
result, err := someFunction()
if err != nil {
fmt.Println("エラーが発生しました:", err)
return
}
fmt.Println("結果:", result)
このパターンは、Go言語のコードで何度も登場します。エラーの見落としを防げる安全な設計です。
標準パッケージでWebサーバーを作る
Go言語の標準ライブラリnet/httpを使えば、フレームワークなしでもWebサーバーを構築できます。
最もシンプルなWebサーバー
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Web Server!")
}
func main() {
http.HandleFunc("/", handler)
fmt.Println("サーバー起動: http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
ブラウザでhttp://localhost:8080にアクセスすると、「Hello, Web Server!」と表示されます。
ルーティングの設定
複数のページを持つWebサイトを作るには、URLごとに処理を分けます。
func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/about", aboutHandler)
http.HandleFunc("/contact", contactHandler)
http.ListenAndServe(":8080", nil)
}
JSONを返すAPI
Web APIでは、JSON形式でデータをやり取りします。
type Response struct {
Message string `json:"message"`
Status int `json:"status"`
}
func apiHandler(w http.ResponseWriter, r *http.Request) {
response := Response{
Message: "API接続成功",
Status: 200,
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(response)
}
Ginフレームワークで実践的なAPI開発
実務では、フレームワークを使うことで開発効率が大幅に向上します。Ginは、Go言語で最も人気のあるWebフレームワークです。
Ginのインストール
go get -u github.com/gin-gonic/gin
基本的な使い方
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello, Gin!",
})
})
r.Run(":8080")
}
RESTful APIの実装
CRUD操作(作成・読取・更新・削除)を実装します。
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
var users = []User{
{ID: 1, Name: "山田太郎", Email: "yamada@example.com"},
}
func main() {
r := gin.Default()
// 一覧取得
r.GET("/users", func(c *gin.Context) {
c.JSON(200, users)
})
// 詳細取得
r.GET("/users/:id", func(c *gin.Context) {
id := c.Param("id")
c.JSON(200, gin.H{"id": id})
})
// 新規作成
r.POST("/users", func(c *gin.Context) {
var newUser User
if err := c.BindJSON(&newUser); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
users = append(users, newUser)
c.JSON(201, newUser)
})
r.Run(":8080")
}
データベースと連携する
実際の業務データを扱うには、データベースとの連携が必要です。
データベースの選び方
- SQLite:ファイルベースで簡単。小規模システムに最適
- MySQL:広く使われている。中規模システムに適している
- PostgreSQL:高機能で信頼性が高い。本格的なシステムに推奨
GORMを使ったデータベース操作
GORMは、Go言語で最も人気のあるORMライブラリです。
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
基本的な使い方
package main
import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type User struct {
ID uint `json:"id" gorm:"primaryKey"`
Name string `json:"name"`
Email string `json:"email"`
}
func main() {
// データベース接続
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
// テーブル作成
db.AutoMigrate(&User{})
// データ作成
user := User{Name: "山田太郎", Email: "yamada@example.com"}
db.Create(&user)
// データ取得
var users []User
db.Find(&users)
}
GinとGORMを組み合わせたAPI
func main() {
db, _ := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
db.AutoMigrate(&User{})
r := gin.Default()
// 一覧取得
r.GET("/users", func(c *gin.Context) {
var users []User
db.Find(&users)
c.JSON(200, users)
})
// 新規作成
r.POST("/users", func(c *gin.Context) {
var user User
if err := c.BindJSON(&user); err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
db.Create(&user)
c.JSON(201, user)
})
r.Run(":8080")
}
これで、データベースと連携した実用的なAPIが完成しました。
実務で使うための次のステップ
認証とセキュリティ
実務では、ユーザー認証やセキュリティ対策が必要です。
- JWT(JSON Web Token):APIの認証によく使われます
- HTTPS化:本番環境では必須です
- 入力値の検証:SQLインジェクションなどの攻撃を防ぎます
テストコードの書き方
Go言語は、テスト機能が標準で用意されています。
// user_test.go
func TestGetUser(t *testing.T) {
user := getUser(1)
if user.Name != "山田太郎" {
t.Error("ユーザー名が一致しません")
}
}
go test ./...
デプロイの選択肢
- VPS(さくらのVPS、ConoHa VPS):自由度が高い
- クラウド(AWS、GCP):スケーラビリティに優れる
- PaaS(Heroku、Render):簡単にデプロイできる
まとめ
この記事では、Go言語を使ったWeb開発の始め方を、環境構築から実践的なAPI開発まで解説しました。
Go言語は、シンプルで高速、そして学びやすい言語です。中小企業が「ちょうどいい」システムを内製化するには最適な選択肢といえます。
完璧を目指す必要はありません。小さく始めて、業務に合わせて育てていくことで、外注に頼らず、自社に最適化されたシステムを構築できます。
まずは簡単なAPIから作り始め、徐々に機能を追加していきましょう。Go言語なら、あなたの「作りたい」を実現できます。