背景:なぜ最初からGoを正しくセットアップする必要があるのか?
FedoraにGoを初めてインストールしたとき、sudo dnf install golangと打ってそのままコーディングを始めた。Go 1.22+が必要なバイナリをビルドするまでは何の問題もなさそうだったが、FedoraのリポジトリにはまだかなりG古いバージョンしかなかった。そのうえVS Codeの拡張機能はGOPATHを認識せず、デバッガーは全く動かず、goplsはクラッシュし続けた。原因を突き止めるのにその夜を丸ごと費やした。
Fedoraをメインの開発マシンとして2年間使っており、パッケージの更新速度にはおおむね満足している。ただしGoに関しては、DNFからインストールしても最新バージョンが手に入るとは限らない。1〜2バージョンの差は小さく聞こえるかもしれないが、Goは6ヶ月ごとにリリースされており、各バージョンにはパフォーマンスの改善や新しいシンタックスが含まれることが多い。この記事では、深夜2時に”なぜビルドできないんだ”と途方に暮れないための、正しいセットアップ方法を紹介する。
DNFでインストールする場合の問題点
FedoraのリポジトリはGo公式リリースより1〜2バージョン遅れることが多い。プロジェクトがGo 1.23を必要としているのにDNFに1.21しかなければ、原因不明のビルドエラーに直面することになる。さらに、DNFでインストールした場合のディレクトリ構成が、VS Code拡張機能の期待する構成と一致しないことがある。GOROOTが間違ったパスを指し、拡張機能がバイナリを見つけられなくなる。
golang.orgからGo公式SDKをインストールする
ステップ1:最新版Goをダウンロードする
最新のダウンロードリンクはgo.dev/dlで確認できる。または以下のコマンドで現在の安定版バージョンを調べることもできる:
# 最新の安定版バージョンを確認する
curl -s https://go.dev/VERSION?m=text
# ダウンロード — VERSIONを実際のバージョンに置き換える(例:go1.23.5)
wget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
ステップ2:/usr/localにインストールする
# 既存のGoがあれば削除する(重要なステップ。スキップするとコンフリクトエラーが発生する)
sudo rm -rf /usr/local/go
# /usr/localに展開する
sudo tar -C /usr/local -xzf go1.23.5.linux-amd64.tar.gz
# ディレクトリが作成されたか確認する
ls /usr/local/go/bin/
# 出力: go gofmt
ステップ3:シェルプロファイルにPATHを設定する
~/.bashrcの末尾に追加する(zshを使っている場合は~/.zshrc):
cat >> ~/.bashrc << 'EOF'
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF
# 即座にリロードする
source ~/.bashrc
# 確認する
go version
# 出力: go version go1.23.5 linux/amd64
それでもcommand not foundと表示される場合は、PATHを確認する:
echo $PATH | tr ':' '\n' | grep go
よくあるはまりポイント:SSHでログインシェルとして接続する場合は、~/.bashrcではなく~/.bash_profileに追加する必要がある。この2つのファイルは異なるコンテキストで読み込まれる。
Go開発のためのVS Code設定
Go公式拡張機能のインストール
VS Codeを開き、Extensions(Ctrl+Shift+X)で「Go」を検索し、publisher「Go Team at Google」のものを選ぶ。これが公式拡張機能だ。名前が似たフォークと間違えないよう注意。
インストールが完了したら、任意の.goファイルを開く。VS CodeがGoツールの追加インストールを促すポップアップを表示する。Install Allをクリックしよう。gopls(言語サーバー)、dlv(Delveデバッガー)、staticcheck、goimportsが一括インストールされる。
# ターミナルから手動でインストールする場合(またはポップアップが表示されない場合)
go install golang.org/x/tools/gopls@latest
go install github.com/go-delve/delve/cmd/dlv@latest
go install honnef.co/go/tools/cmd/staticcheck@latest
go install golang.org/x/tools/cmd/goimports@latest
VS Codeのsettings.json設定
VS Codeの設定(Ctrl+,)を開き、JSONビュー(右上のアイコン)に切り替えて、以下の設定を追加する:
{
"go.goroot": "/usr/local/go",
"go.gopath": "/home/YOUR_USERNAME/go",
"go.toolsManagement.autoUpdate": true,
"go.lintTool": "staticcheck",
"go.formatTool": "goimports",
"go.useLanguageServer": true,
"[go]": {
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
}
}
}
YOUR_USERNAMEは実際のユーザー名に置き換える(whoamiで確認できる)。保存後はVS Codeを完全に再起動する。ウィンドウのリロードだけでは不十分で、goplsが正しいGOROOTを認識するには完全な再起動が必要だ。
動作確認用のGoプロジェクトを作成する
# プロジェクトディレクトリを作成する
mkdir -p ~/projects/hello-go && cd ~/projects/hello-go
# Goモジュールを初期化する
go mod init hello-go
main.goファイルを作成する:
package main
import (
"fmt"
"runtime"
)
func main() {
fmt.Printf("Hello from Go %s!\n", runtime.Version())
fmt.Printf("OS: %s, Arch: %s\n", runtime.GOOS, runtime.GOARCH)
}
# テスト実行する
go run main.go
# 出力:
# Hello from Go go1.23.5!
# OS: linux, Arch: amd64
VS CodeでDelveデバッグをセットアップする
プロジェクトディレクトリに.vscode/launch.jsonファイルを作成する:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Go App",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}",
"env": {},
"args": []
}
]
}
コードの行番号左側をクリックしてブレークポイントを設定し、F5を押してデバッグセッションを開始する。Delveがptraceに関するパーミッションエラーを報告する場合、これはFedoraのカーネルセキュリティ強化によるものでインストールの問題ではない:
# ptraceエラーを一時的に修正する(再起動でリセットされる)
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
# 恒久的に修正する
sudo tee /etc/sysctl.d/10-ptrace.conf << 'EOF'
kernel.yama.ptrace_scope = 0
EOF
# 再起動なしで即座に適用する
sudo sysctl --system
Go環境の確認とモニタリング
すべての設定を確認する
# Go環境を確認する — チェックすべき重要な設定値
go env GOROOT GOPATH GOMODCACHE GOPROXY
# 期待される出力:
# GOROOT=/usr/local/go
# GOPATH=/home/username/go
# GOMODCACHE=/home/username/go/pkg/mod
# GOPROXY=https://proxy.golang.org,direct
# インストール済みツールを確認する
which gopls && gopls version
which dlv && dlv version
which staticcheck && staticcheck --version
テストを実行してすべての動作を確認する
# hello-goプロジェクトにテストファイルを作成する
cat > main_test.go << 'EOF'
package main
import "testing"
func TestVersion(t *testing.T) {
got := "hello-go"
want := "hello-go"
if got != want {
t.Errorf("got %q, want %q", got, want)
}
}
EOF
# テストを実行する
go test -v ./...
# 出力:
# --- PASS: TestVersion (0.00s)
# PASS
新しいバージョンへのGoアップデートスクリプト
この方法でインストールする利点のひとつは、アップデートが非常に簡単なことだ。DNFとのコンフリクトを心配する必要もない:
#!/bin/bash
# ~/bin/update-go.sh として保存する
NEW_VERSION="go1.24.0" # インストールしたいバージョンに置き換える
wget https://go.dev/dl/${NEW_VERSION}.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf ${NEW_VERSION}.linux-amd64.tar.gz
rm ${NEW_VERSION}.linux-amd64.tar.gz
go version
よくあるエラーと素早い対処法
- goplsがGOROOTを認識しない:settings.json編集後はVS Codeを完全に再起動する。ウィンドウのリロードでは不十分。
- PATH追加後もgo: command not found:
source ~/.bashrcを実行するか、新しいターミナルを開く。SSHのログインシェルを使う場合は~/.bash_profileに追加する。 - Delveが”operation not permitted”でクラッシュする:上記の手順で
ptrace_scopeを修正する。Fedoraのデフォルトのカーネルハードニングにより非常によく起きる問題だ。 - VS Codeで保存時にコードがフォーマットされない:
goimportsを手動で再インストールし、VS CodeのターミナルのPATHにGOPATH/binが含まれていることを確認する。
セットアップが完了すれば、堅牢なGo開発環境の出来上がりだ。オートコンプリート完備の言語サーバー、保存時の自動フォーマット、ブレークポイントが使えるデバッガー、そしてテストランナーがすべて揃っている。ここからREST API、CLIツール、マイクロサービスなど何でも作り始められる。環境の心配はもう不要だ。

