【Go言語入門】Web開発の始め方を実例で解説|初心者でも作れるAPI開発

kento_morota 16分で読めます

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)が最もおすすめです。無料で、拡張機能が豊富、動作も軽快です。

  1. 公式サイト(https://code.visualstudio.com/)からダウンロードしてインストール
  2. 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言語なら、あなたの「作りたい」を実現できます。

#Go言語#入門#Web開発
共有:

ちょっとした業務の悩みも、気軽にご相談ください。

まずは話だけ聞いてもらう