Laragon番外編7|Goを手動追加・切り替える|Go Modules・Web API・VS Codeまで確認
Laragonでは、PHPやNode.js、Pythonだけでなく、Goも複数バージョンを切り替えながら利用できます。
今回はLaragon番外編7として、Go公式サイトからWindows版のZIPファイルを取得し、Laragonへ手動でGoを追加する方法を実際に確認していきます。
Goを追加して終わりではありません。
Go Modulesでテストプロジェクトを作成し、VS CodeでGoの開発環境を整えたあと、Go標準パッケージのnet/httpを使ってWeb APIを作成します。
さらにHTMLとJavaScriptのfetch()からAPIを呼び出し、最後はDelveを使ったデバッグまで確認します。
この記事では、主に次の流れを実機で確認します。
- 現在Laragonで使われているGoを確認する
- Go公式サイトからWindows版ZIPを取得する
- SHA-256を確認する
- Go 1.27.1をLaragonへ手動追加する
- LaragonでGoのバージョンを切り替える
- Go Modulesでプロジェクトを作る
- VS CodeのGo拡張を使う
go runとgo buildを確認する- GoでJSON Web APIを作る
- HTMLとJavaScriptの
fetch()からAPIを呼び出す - 404・405・ポート競合などのエラー処理を確認する
- Delveでブレークポイントと変数を確認する
LaragonにはQuick addでパッケージを追加できる仕組みもあります。
ただし今回は、Go公式サイトから取得したZIPをLaragonへ直接配置する方法を中心に確認します。
この方法を知っておくと、Laragon側の追加メニューだけに依存せず、自分でGoのバージョンを管理する仕組みを理解しやすくなります。
- 現在Laragonで使われているGoを確認する
- LaragonへGoを手動追加する
- Go Modulesでテストプロジェクトを作る
- VS CodeでGoの開発環境を整える
- 最初のGoプログラムを動かす
- GoでWeb APIを作る
- HTMLとJavaScriptからGo Web APIを呼び出す
- エラー処理も確認する
- GET以外は405 Method Not Allowedにする
- 8080番ポートが使用中で起動できない場合
- VS CodeとDelveでGoをデバッグする
- Goで初学者が引っかかりやすかったポイント
- 最終的なプロジェクト構成を確認する
- LaragonへGoを追加してWeb APIまで動かせた
- 前の記事
- Laragon番外編6へ
- Laragon番外編の流れへ戻る
- Laragon番外編の流れへ戻る
- 次に読む
- Laragon番外編8へ
現在Laragonで使われているGoを確認する
まず、新しいGoを追加する前に、現在LaragonでどのGoが使われているか確認します。
LaragonのTerminalを開いて、次のコマンドを実行します。
where.exe go
go versionPowerShellwhere.exe goでは、現在PATHから呼び出されるgo.exeの場所を確認できます。
今回の作業開始時点では、次のGoが使われていました。
C:\laragon\bin\go\go1.24.1\bin\go.exe
go versionでは、Go 1.24.1が有効になっていることを確認できました。

GOROOT・GOPATH・GOMODCACHEも確認する
Goでは、最初のうちは似た名前に見えるパスがいくつか登場します。
今回は次の3つも確認しました。
go env GOROOT
go env GOPATH
go env GOMODCACHEPowerShell作業開始時点では、GOROOTはGo 1.24.1を指していました。
一方、GOPATHとGOMODCACHEはLaragon側の共通領域に設定されています。

Go初学者メモ
GOROOTは、現在使っているGo本体の場所です。
GOPATHは、Goがモジュールキャッシュやインストールした実行ファイルなどを保存するときの基準になるパスです。
GOMODCACHEは、Go Modulesで取得したモジュールを保存するキャッシュ領域です。
LaragonでGoのバージョンを切り替えると、GOROOTは切り替えたGoへ変わります。一方、今回の環境ではGOPATHとGOMODCACHEはLaragonの共通領域を利用しています。
LaragonへGoを手動追加する
次に、Go 1.27.1をLaragonへ追加します。
追加前にLaragonのGoメニューを確認すると、今回の環境ではGo 1.23.4とGo 1.24.1が登録されており、Go 1.24.1が選択されていました。

手動追加の全体像は次のようになります。

Go公式サイトからWindows版ZIPを取得する
Go公式サイトのダウンロードページを開きます。
今回の検証では、Windows 64bit環境で次のZIPを使用しました。
go1.27.1.windows-amd64.zip
Laragonへ手動追加するため、今回はWindows用インストーラーではなくZIPアーカイブを選びます。

SHA-256を確認する
ダウンロード後は、ZIPファイルのSHA-256も確認しました。
PowerShellではGet-FileHashを利用できます。
Get-FileHash -Algorithm SHA256 "$env:USERPROFILE\Downloads\go1.27.1.windows-amd64.zip"PowerShell今回確認したZIPは、公式サイトに掲載されていたSHA-256と一致しました。

SHA-256確認は、ダウンロードしたファイルが公式に公開されたものと同じ内容かを確認するために使えます。
毎回必須という意味ではありませんが、開発環境へ実行ファイルを追加するときに覚えておくと役立つ確認方法です。
ZIPの中身を確認する
ZIPを展開すると、最上位にgoフォルダがあります。
その中には、bin、pkg、srcなどGo本体として必要なファイルが含まれています。

goフォルダをgo1.27.1へ変更して配置する
展開したgoフォルダを、そのままLaragonへ置くのではなく、
go1.27.1
へリネームします。
そのあと次の場所へ配置します。
C:\laragon\bin\go\
今回の最終状態は次のようになりました。
C:\laragon\bin\go\
├─ go1.23.4
├─ go1.24.1
└─ go1.27.1

Laragonを再起動してGo 1.27.1へ切り替える
フォルダを追加したあと、Laragonを再起動します。
再起動後にGoのバージョンメニューを開くと、新しく追加したGo 1.27.1が認識されました。
Go 1.27.1を選択します。

Go 1.27.1へ切り替わったことを確認する
バージョンを切り替えたら、新しいTerminalを開いて確認します。
where.exe go
go version
go env GOROOT
go env GOPATH
go env GOMODCACHE
PowerShell今回の実機確認値:
C:\laragon\bin\go\go1.27.1\bin\go.exe
go version go1.27.1 windows/amd64
C:\laragon\bin\go\go1.27.1
C:\laragon\usr\go
C:\laragon\usr\go\pkg\modPlaintext今回の環境では、
C:\laragon\bin\go\go1.27.1\bin\go.exe
が使用され、
go version go1.27.1 windows/amd64
と表示されました。

切り替え後の環境では、次の構成になりました。

今回の実機確認値は次のとおりです。
GOROOT
C:\laragon\bin\go\go1.27.1
GOPATH
C:\laragon\usr\go
GOMODCACHE
C:\laragon\usr\go\pkg\mod
Go Modulesでテストプロジェクトを作る
Goの切り替えが終わったので、実際にプロジェクトを作成します。
今回はLaragonのwww配下へ、
C:\laragon\www\laragon-go-test
を作りました。
Go Modulesもここで初期化します。
cd C:\laragon\www
mkdir laragon-go-test
cd laragon-go-test
go mod init example.com/laragon-go-testPowerShell生成されたgo.modは次の内容です。
module example.com/laragon-go-test
go 1.27.1PowerShell
Go初学者メモ
go.modは、そのGoプロジェクトがどのモジュールなのか、どのGoバージョンを基準にするのか、どの依存モジュールを使うのかを管理する中心的なファイルです。
新しくGo Modules対応のプロジェクトを作る場合は、まずgo mod initでモジュールを初期化する流れを基本として覚えておくと理解しやすくなります。
VS CodeでGoの開発環境を整える
プロジェクトフォルダへ移動した状態で、VS Codeを開きます。
code .
VS CodeでGoを書く場合は、Go Team at Googleが提供するGo拡張を利用できます。

今回の環境ではGo拡張自体はインストール済みでしたが、無効になっていたため有効化しました。
gopls・DelveなどをGo 1.27.1に合わせる
Go 1.27.1へ切り替えたあと、VS CodeからGo関連ツールの更新通知が表示されました。
今回更新された主なツールは次のとおりです。
| ツール | 主な役割 |
|---|---|
| gopls | GoのLanguage Server |
| dlv | Delveデバッガ |
| impl | インターフェース実装補助 |
| goplay | Goコード実行補助 |
すべて正常に更新されました。

最初のGoプログラムを動かす
まずはWeb APIへ進む前に、最小限のGoプログラムを動かします。
main.goを作成します。
package main
import "fmt"
func main() {
fmt.Println("Laragon Go Environment Check")
}Go実行します。
go run .PowerShell正常であれば、
Laragon Go Environment Check
と表示されます。

go runとgo buildの違い
go run .は、開発中にプログラムをビルドしてそのまま実行するのに便利です。
一方、実行ファイルとして残したい場合はgo buildを使えます。
go build -o laragon-go-test.exe .
.\laragon-go-test.exePowerShellWindowsでは、
laragon-go-test.exe
が生成されます。
Go初学者メモ
ざっくり覚えるなら、
go run .
→ 開発中にすぐ動かして確認する
go build
→ 実行ファイルを作る
という違いから始めると分かりやすいです。
GoでWeb APIを作る
ここからはWeb開発へ進みます。
Goには標準ライブラリとしてnet/httpが用意されているため、追加フレームワークを入れなくてもHTTPサーバーを動かせます。
今回は、
/api/status
へアクセスすると、現在のGo環境をJSONで返すAPIを作ります。
最初のAPI確認用コードは
package main
import (
"encoding/json"
"fmt"
"net/http"
"runtime"
)
type Status struct {
Status string `json:"status"`
Language string `json:"language"`
GoVersion string `json:"goVersion"`
OS string `json:"os"`
Architecture string `json:"architecture"`
}
func main() {
http.HandleFunc("/api/status", func(w http.ResponseWriter, r *http.Request) {
status := Status{
Status: "success",
Language: "Go",
GoVersion: runtime.Version(),
OS: runtime.GOOS,
Architecture: runtime.GOARCH,
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(status)
})
fmt.Println("Laragon Go Environment Check")
if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
fmt.Println("Server error:", err)
}
}Goです。
サーバーを起動します。
go run .PowerShellブラウザから次へアクセスします。
http://127.0.0.1:8080/api/status
今回は次のJSONを取得できました。
{
"status": "success",
"language": "Go",
"goVersion": "go1.27.1",
"os": "windows",
"architecture": "amd64"
}

今回は、
127.0.0.1:8080
で待ち受けています。
127.0.0.1はローカルPC自身を指します。
学習用のローカルWebサーバーなので、今回は外部ネットワークへ公開する必要がありません。
HTMLとJavaScriptからGo Web APIを呼び出す
APIだけでも動作確認はできますが、Web開発としてもう一歩進めて、HTMLとJavaScriptからGo APIを呼び出します。
今回の最終的な通信の流れは次のようになります。

最終的なプロジェクトでは、
static
└─ index.html
を追加します。
Go側もHTMLを配信できるように変更します。
最終版のmain.goは
package main
import (
"encoding/json"
"fmt"
"net/http"
"runtime"
)
type Status struct {
Status string `json:"status"`
Language string `json:"language"`
GoVersion string `json:"goVersion"`
OS string `json:"os"`
Architecture string `json:"architecture"`
}
func main() {
http.HandleFunc("/api/status", func(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
w.Header().Set("Allow", http.MethodGet)
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
status := Status{
Status: "success",
Language: "Go",
GoVersion: runtime.Version(),
OS: runtime.GOOS,
Architecture: runtime.GOARCH,
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
json.NewEncoder(w).Encode(status)
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
http.ServeFile(w, r, "static/index.html")
})
fmt.Println("Laragon Go Environment Check")
if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil {
fmt.Println("Server error:", err)
}
}Goです。
static/index.htmlは
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Laragon Go Environment Check</title>
<style>
body {
max-width: 720px;
margin: 40px auto;
padding: 0 20px;
font-family: Arial, sans-serif;
line-height: 1.6;
}
#status {
margin-top: 24px;
padding: 20px;
border: 1px solid #d1d5db;
border-radius: 12px;
background-color: #f8fcfc;
}
#status strong {
display: inline-block;
width: 120px;
}
</style>
</head>
<body>
<h1>Laragon Go Environment Check</h1>
<div id="status">
<p>APIデータを読み込み中です...</p>
</div>
<script>
async function loadStatus() {
try {
const response = await fetch("/api/status");
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
const data = await response.json();
const statusElement = document.getElementById("status");
statusElement.innerHTML = `
<h2>Environment Status</h2>
<p><strong>API Status:</strong> ${data.status}</p>
<p><strong>Language:</strong> ${data.language}</p>
<p><strong>Go Version:</strong> ${data.goVersion}</p>
<p><strong>OS:</strong> ${data.os}</p>
<p><strong>Architecture:</strong> ${data.architecture}</p>
`;
} catch (error) {
console.error("API ERROR:", error);
document.getElementById("status").innerHTML = `
<h2>Environment Status</h2>
<p><strong>API Status:</strong> Error</p>
<p>APIデータの取得に失敗しました。コンソールを確認してください。</p>
<p id="api-error-detail"></p>
`;
document.getElementById("api-error-detail").textContent =
`API ERROR: ${error}`;
}
}
loadStatus();
</script>
</body>
</html>HTMLです。
ブラウザで、
http://127.0.0.1:8080/
を開くと、JavaScriptが/api/statusへアクセスし、JSONを取得します。
取得した値をDOMへ反映すると、次の画面になりました。

エラー処理も確認する
正常に動くだけではなく、失敗した場合の処理も確認します。
今回はJavaScript側を、
async / await
+
try...catch
で構成しました。
さらに重要なのがresponse.okです。
fetch()は404や500などのHTTPエラーステータスを受け取っても、それだけではcatchへ移動しません。そのため、response.okを確認し、必要に応じて自分でエラーをthrowします。
そのため、
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
のようにHTTPステータスを確認しています。
404を発生させて確認する
一時的にAPIのURLを存在しないものへ変更します。
通常:
const response = await fetch("/api/status");HTML404テスト時のみ:
const response = await fetch("/api/not-found");HTMLすると404を検出し、画面側へエラーを表示できました。

確認後は必ず、
/api/status
へ戻します。
Go初学者メモ
JavaScriptでは今回、
try...catch
を使っています。
一方、Goの通常のエラー処理では、
if err != nil
という形をよく使います。
Goにもpanicやrecoverはありますが、通常のエラー処理をすべて例外のように扱うものではありません。
まずはGoはエラー値を確認する言語という感覚から覚えると分かりやすいです。
存在しないURLでHTMLが返らないようにする
今回、実装途中では/api/not-foundへアクセスしたとき、JSONではなくindex.htmlが返ってしまうことがありました。
理由は、"/"のハンドラーが、より具体的なパターンに一致しないパスも受け取るためです。
そこで最終コードでは、
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
を追加しています。
これにより、存在しないパスでは正しく404を返せます。
GET以外は405 Method Not Allowedにする
/api/statusは、環境情報を取得するAPIです。
今回はGETだけを許可するようにしています。
最終版main.goでは、
if r.Method != http.MethodGet {
w.Header().Set("Allow", http.MethodGet)
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
return
}
を入れています。
PowerShellではcurl.exeを使って確認できます。
GET:
curl.exe -i http://127.0.0.1:8080/api/statusHTMLPOST:
curl.exe -i -X POST http://127.0.0.1:8080/api/statusHTMLGETの場合は、
HTTP/1.1 200 OK
になります。
POSTの場合は、
HTTP/1.1 405 Method Not Allowed
Allow: GET
となります。
Go初学者メモ
404 Not Found
→ そのURL・リソースが見つからない
405 Method Not Allowed
→ URL自体はあるが、そのHTTPメソッドは許可していない
今回は/api/status自体は存在しますが、POSTを許可していないため405になります。
8080番ポートが使用中で起動できない場合
Go Webサーバーを試している途中で、次のエラーにも遭遇しました。
listen tcp 127.0.0.1:8080: bind:
Only one usage of each socket address
(protocol/network address/port) is normally permitted.

通常はGoサーバーを実行しているターミナルで、
Ctrl + C
を押して停止します。
それでも8080番ポートが残っている場合は、PowerShellで確認できます。
まず確認:
Get-NetTCPConnection -LocalPort 8080 -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcessPowerShell表示されたPIDを確認します
Get-Process -Id <PID>PowerShelllaragon-go-testであることを確認したうえで、必要な場合だけ停止します。
Stop-Process -Id <PID>PowerShell最後に再確認します。
Get-NetTCPConnection -LocalPort 8080 -State ListenPowerShellリスナーが存在しなければ、
No matching MSFT_NetTCPConnection objects foundPowerShell今回の実機検証でも、残っていたプロセスがlaragon-go-testであることを確認してから停止しました。
Stop-Processを使う前に、必ずGet-ProcessでPIDとプロセス名を確認してください。
PIDだけを見て、確認せずに別のプロセスを終了しないようにします。
通常はCtrl + Cで停止してからgo run .を実行し直せば十分です。
今回の検証環境では、ターミナルの表示が戻っていてもGoプロセスが残っていることがありました。
その場合はPIDを確認して停止するか、VS Codeのターミナルセッションを閉じて新しいターミナルを作成してから再実行すると切り分けやすくなります。
VS CodeとDelveでGoをデバッグする
最後にVS CodeのGoデバッガを確認します。
Go拡張から利用できるDelveを使うと、プログラムを途中で停止し、変数の内容などを確認できます。
Go: Launch packageを追加する
VS Codeの「実行とデバッグ」で構成を追加し、
Go: Launch package
を選択します。

生成されたlaunch.jsonは
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}"
}
]
}JSONです。
ブレークポイントでAPI処理を停止する
/api/statusの処理内にブレークポイントを設定します。
今回は、
w.Header().Set("Content-Type", "application/json; charset=utf-8")
の行で停止させました。
ブラウザから、
http://127.0.0.1:8080/api/status
へアクセスすると、JSONがすぐに返らず、VS Code側で処理が停止します。
これは正常です。
GoがAPIレスポンスを返す途中で止まっているため、ブラウザ側は処理の再開を待っています。

Localsでstatusの値を確認する
停止中にVS Codeの「変数」からLocalsを開き、statusを展開しました。
すると、
Status = "success"
Language = "Go"
GoVersion = "go1.27.1"
OS = "windows"
Architecture = "amd64"
を確認できました。

Go初学者メモ
ブレークポイントは、どの行でも必ず止められるわけではありません。
今回、
status := Status{
という複数行の構造体リテラル先頭へ置いたところ、Delveから、
could not find statement
please use a line with a statement
と表示されました。
そのため、実際に実行可能な、
w.Header().Set(...)
の行へ移動しました。
型定義の行など、実行時に通らない位置へブレークポイントを置いても停止しません。
Goで初学者が引っかかりやすかったポイント
今回、実際にコードを書きながらいくつかGoらしいルールも確認できました。
| ポイント | 覚え方 |
|---|---|
| 未使用のimport | Goでは未使用importがエラーになる |
| 未使用変数 | 作っただけで使っていない変数もエラーになる |
:= | 関数内で変数を宣言しながら値を代入できる |
| JSONタグ | `json:"status"` のようにバッククォートを使う |
go run . | 開発中の実行確認 |
go build | 実行ファイルを生成 |
| Goコードの変更 | 実行中サーバーには自動反映されないため再起動する |
| 404 | URLやリソースが見つからない |
| 405 | URLはあるがHTTPメソッドが許可されていない |
特に:=はGoを始めたときに頻繁に目にします。
たとえば、
status := Status{}
は、statusという変数を宣言しながらStatus{}を代入しています。
ただし:=はどこでも使えるものではなく、関数内で使う構文です。
パッケージレベルではvarなどを使います。
最終的なプロジェクト構成を確認する
今回の検証を終えた時点では、プロジェクトは次の構成になりました。
laragon-go-test
│ go.mod
│ laragon-go-test.exe
│ main.go
│
├─.vscode
│ launch.json
│ settings.json
│
└─static
index.htmlPlaintextlaunch.jsonはVS Codeのデバッグ設定です。
static/index.htmlはブラウザへ表示するHTMLです。
main.goではWebサーバー・JSON API・HTML配信を担当しています。
最終版をEXEへビルドする
最後に、Web APIまで実装した現在のコードから、改めてEXEを生成しました。
go build -o laragon-go-test.exe .PowerShell実行:
.\laragon-go-test.exePowerShellブラウザ:
http://127.0.0.1:8080/Plaintext今回の確認では、
Laragon Go Environment Check
と表示されたあと、ブラウザから、
http://127.0.0.1:8080/
へアクセスし、最終画面が正常に表示されました。
少し発展
今回のコードでは、
http.ServeFile(w, r, "static/index.html")
のように相対パスを使っています。
そのため、今回のようにプロジェクトルート、
C:\laragon\www\laragon-go-test
からEXEを起動する構成が分かりやすいです。
今後、本格的なアプリとして配布する場合は、埋め込みファイルシステムのembed、設定管理、ログ、タイムアウト、Graceful Shutdownなども学習対象になります。
最初から全部盛り込まず、まず今回の構成でHTTPサーバーとAPIの流れを理解してから進むのがおすすめです。
LaragonへGoを追加してWeb APIまで動かせた
今回は、Go 1.27.1を公式ZIPからLaragonへ手動追加し、バージョン切り替えからWeb API・VS Codeデバッグまで確認しました。
単に、
go version
が表示されるだけではなく、
Goを追加する
↓
Laragonで切り替える
↓
Go Modulesを作る
↓
Goコードを実行する
↓
Web APIを作る
↓
JavaScriptからAPIを呼び出す
↓
エラーを確認する
↓
Delveで内部の値を見る
↓
EXEへビルドする
ところまで実際に動かせています。
今回の到達点は、次のとおりです。
- Go 1.27.1をLaragonへ手動追加できた
- Go 1.24.1から1.27.1へ切り替えできた
- GOROOT・GOPATH・GOMODCACHEを確認できた
- Go Modulesを初期化できた
- VS CodeのGo開発ツールを利用できた
go runとgo buildを確認できた- Go標準ライブラリでWeb APIを作成できた
- JavaScriptの
fetch()と連携できた - 404・405・8080番ポート競合を確認できた
- Delveでブレークポイントと変数を確認できた
- 最終版EXEからWeb画面を表示できた
Goは、Web APIやCLIツール、バックエンド開発などにも利用できます。
今回のようにLaragon内でGoのバージョンを管理できるようにしておくと、他の開発環境と並べながらGoを試しやすくなります。
PR:『初めてのGo言語 第2版 ― 他言語プログラマーのためのイディオマティックGo実践ガイド』
LaragonでGoを利用できる環境を整えたら、次は実際にGoのコードを書きながら、より実践的な使い方へ進んでみませんか? 基本文法からGoらしいコードの書き方、パッケージ構成、エラー処理、並行処理、開発ツールの使い方まで、Goを継続して学びたい方におすすめです。
※本書は2025年刊の第2版です。価格や在庫、版数は変わるため、最終確認はリンク先でお願いします。
前の記事
Laragon番外編6へ

Laragon番外編の流れへ戻る
Laragon番外編の流れへ戻る
Laragon番外編を最初から確認したい場合は、番外編1で複数バージョンを追加・切り替える基本的な仕組みから確認できます。

次に読む
Laragon番外編8へ
次は、LaragonへJDKを追加してJava開発環境を整えます。JDKのバージョン切り替えから、java・javacによる確認、Javaプログラムのコンパイル・実行、VS Codeでの開発まで実機で確認していきます。


