1. 全部指定されている
  2. 全部空なら既定値
  3. ポートだけ指定
  4. Mac向けのビルド
  5. ポートが数値でない
コース一覧
Go入門
1バイナリでデプロイ

Go入門

変数とゼロ値、Go唯一のループであるfor、複数戻り値とエラー処理、スライスとマップ、構造体とメソッド、ゴルーチンによる並行処理、net/httpによるAPI開発まで、Goの基礎を、毎レッスン実際にコードを書き、フリマアプリのAPIをGoで作りながら学びます。

1
Hello, Go
01. Goとは15分
02. 実行してみる15分
03. packageとmain15分
04. fmtで出力する15分
05. go buildと1バイナリ15分
06. つくる: 起動バナー20分
07. 第1章クイズ10分
2
変数と型
01. varで宣言する15分
02. := の短縮宣言15分
03. ゼロ値(Goならでは)15分
04. 基本の型15分
05. 暗黙変換なし15分
06. 定数とiota15分
07. つくる: 商品データ表示20分
08. 第2章クイズ10分
3
制御構文(forしかない世界)
01. Goのif15分
02. forしかない世界15分
03. forの七変化15分
04. Goのswitch15分
05. 定番: FizzBuzz15分
06. ループで集計15分
07. つくる: 商品集計20分
08. 第3章クイズ10分
4
関数とエラー処理
01. funcで関数を作る15分
02. 複数戻り値(Goならでは)15分
03. if err != nil(Goの心臓)15分
04. エラーを作る15分
05. deferで後始末15分
06. つくる: 検証つき関数群20分
07. 第4章クイズ10分
5
スライスとマップ
01. 配列15分
02. スライス15分
03. appendで育てる15分
04. rangeで走査する15分
05. マップ15分
06. カンマokイディオム15分
07. つくる: 検索と集計20分
08. 第5章クイズ10分
6
構造体とメソッド
01. 構造体15分
02. 初期化とフィールド15分
03. メソッド15分
04. ポインタレシーバ20分
05. New関数の慣習15分
06. 構造体のスライス15分
07. つくる: Itemで再設計20分
08. 第6章クイズ10分
7
ゴルーチンと並行処理のさわり
01. ゴルーチン15分
02. チャネル20分
03. 待ち合わせ20分
04. 並行の落とし穴20分
05. つくる: 並行集計20分
06. 第7章クイズ10分
8
Web API(net/http)
01. サーバーを立てる20分
02. ハンドラ関数20分
03. JSONを返す20分
04. ルーティング20分
05. 一覧API20分
06. 詳細APIと40420分
07. 出品API20分
08. つくる: API主要部完成25分
09. 第8章クイズ10分
9
総合制作
01. 仕様互換を仕上げる25分
02. Node版と差し替える25分
03. 1バイナリでデプロイ25分
04. 自由拡張25分
05. 完成と次のステップ20分

1バイナリでデプロイ

置くだけで動く

第1章で「1バイナリ」の話をしました。ここでそれを使います。

プレーンテキスト

go build -o fleama-go scp fleama-go server:/opt/fleama/ ssh server /opt/fleama/fleama-go

3行です。サーバーに Go を入れる必要も、依存を取ってくる必要もありません。

プレーンテキスト

Node.js node を入れる → npm install → node_modules が数万ファイル Go ファイルを1つ置く

別の OS 向けに作る

手元が Mac で、サーバーが Linux ということがほとんどです。Go はその場で相手向けに作れます。

プレーンテキスト

GOOS=linux GOARCH=amd64 go build -o fleama-go

プレーンテキスト

GOOS 動かす OS。linux / darwin / windows GOARCH CPU の種類。amd64 / arm64

クロスコンパイルと呼びます。他の言語では専用の環境を用意することが多い作業が、環境変数2つで済みます。

間違えると動きません。 Mac 向けに作ったものを Linux に置くと cannot execute binary file と言われます。

常駐させる

そのまま実行すると、端末を閉じた時点で止まります。サーバーで動かし続けるには、OS に面倒を見てもらいます。Linux では systemd が担当します。

プレーンテキスト

[Unit] Description=fleama-go API [Service] ExecStart=/opt/fleama/fleama-go Restart=always User=fleama [Install] WantedBy=multi-user.target

これを /etc/systemd/system/fleama-go.service に置きます。

プレーンテキスト

sudo systemctl daemon-reload sudo systemctl enable fleama-go sudo systemctl start fleama-go sudo systemctl status fleama-go

Restart=always があるので、落ちても自動で起き上がります。enable しておくと、サーバーを再起動しても勝手に立ち上がります。

更新するとき

プレーンテキスト

GOOS=linux GOARCH=amd64 go build -o fleama-go scp fleama-go server:/opt/fleama/fleama-go.new ssh server 'mv /opt/fleama/fleama-go.new /opt/fleama/fleama-go && systemctl restart fleama-go'

新しいファイルを別名で置いてから入れ替えます。転送の途中で壊れた状態が動くのを防ぐためです。

実行中のファイルをそのまま上書きしようとすると text file busy で拒まれることもあります。別名で置いて mv するのが確実です。

設定は環境変数で渡す

Go

port := os.Getenv("PORT") if port == "" { port = "8080" } http.ListenAndServe(":"+port, mux)

バイナリに設定を埋め込むと、環境ごとに作り直すことになります。外から渡して、無ければ既定値にするのが定石です。第5章のカンマokと同じ、「無いときどうするか」を決める話です。

要件

  1. 空文字の項目は既定値を使う(port は 8080、env は development、goos は linux)
  2. ポートが数値に変換できないときは 不正なポートです を返す
  3. listen=:PORT env=ENV build=GOOS/amd64 の形を返す

入出力例

buildConfig("8080", "production", "linux") → "listen=:8080 env=production build=linux/amd64" buildConfig("", "", "") → "listen=:8080 env=development build=linux/amd64" buildConfig("3000", "", "") → "listen=:3000 env=development build=linux/amd64" buildConfig("8080", "production", "darwin") → "listen=:8080 env=production build=darwin/amd64" buildConfig("abc", "production", "linux") → "不正なポートです"

ヒント

既定値の代入は `if port == "" { port = "8080" }` の形です

ポートの検証は既定値を入れた**後**に行います。空文字は既定値になるので、不正にはなりません

値そのものは要らないので `if _, err := strconv.Atoi(port); err != nil {` と書けます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • 自由拡張

    欲しいAPIを自分で設計して実装し、並行処理を活かした集計APIを1本作れるようになります。

  • 完成と次のステップ

    fleama-goの完成を確かめ、次に学ぶものを自分で選べるようになります。

  • Node版と差し替える

    同じ仕様の別実装に置き換えられることを確かめ、実務のリプレイスを疑似体験します。

  • 仕様互換を仕上げる

    ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
  • コンパイルソースをバイトコードへ変換する処理
  • 環境変数JWT_SECRET など秘匿値を渡す手段
  • 変数データに名前をつけて参照する仕組み
main.go
学習モード
エディタを読み込んでいます

メモ

1バイナリでデプロイ

⌘S で保存