🚀

Go Re:boot #1 - 開発環境のセットアップと Go Workspaces 入門

に公開

はじめに

この連載「Go Re:boot」では、基礎から実践まで、現場ですぐに役立つGo言語の知識を段階的に学び直すことを目的とします。何を隠そう、筆者自身がGoの進化の速さに追いつき、知識を再整理したいという思いからこの連載を始めることにしました。
第1回となる今回は、Goの開発環境構築と、Go 1.18から導入された注目の機能「Go Workspaces」について解説します。

この記事で目指すゴール

  • OSに合わせたGoのインストール手順を理解する
  • VS Codeと推奨拡張機能で快適な開発環境を整える
  • LinterとFormatterをセットアップし、チーム開発の規約を統一する
  • go workコマンドを使い、シンプルなモノレポ構成のプロジェクトを立ち上げる

1. Goのインストールと環境設定

まずはGo本体をインストールします。Goのバージョンは頻繁に更新されるため、複数のバージョンを管理できるツールを使うのが現代的なアプローチです。

Windows: scoopによるインストール

Windowsユーザーには、コマンドラインからソフトウェアを管理できるscoopの利用を推奨します。

# scoopが未インストールの場合
> irm get.scoop.sh | iex

# Goをインストール
> scoop install go

macOS: Homebrewによるインストール

macOSでは、パッケージマネージャーのHomebrewを使うのが最も一般的です。

# Homebrewが未インストールの場合
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Goをインストール
$ brew install go

Linux (Ubuntu): aptによるインストール

Ubuntuや他のDebian系ディストリビューションではaptコマンドでインストールできます。

$ sudo apt update
$ sudo apt install golang-go

環境変数の確認と設定

インストールが完了したら、ターミナルを開いて以下のコマンドを実行し、Goが正しくインストールされていることを確認します。

$ go version
go version go1.24.5 linux/amd64 # 出力はバージョンやOSにより異なる

次に、Goの環境変数について理解を深めましょう。go envコマンドで一覧表示できます。

  • GOROOT: Goのコンパイラや標準ライブラリが格納されているディレクトリです。通常は自動で設定され、手動で変更する必要はほとんどありません。
  • GOPATH: Goのワークスペースとして機能するディレクトリです。go installでインストールしたサードパーティ製のツールや、go getで取得したパッケージのキャッシュがここに保存されます。デフォルトではホームディレクトリ配下のgoフォルダ(例: /home/user/go)に設定されています。

特にこだわりがなければ、GOPATHはデフォルト設定のまま利用することをお勧めします。


2. VS Codeによる開発環境の最適化

Go開発で最も人気のあるエディタの一つがVS Codeです。goplsという言語サーバーと連携することで、強力な開発体験を得られます。

推奨拡張機能のインストール

VS Codeを開き、拡張機能タブから以下をインストールします。

  • Go (公式拡張機能): golang.go - goplsの連携、デバッグ、テスト実行など、Go開発に必要な機能がオールインワンで提供されます。
  • Code Spell Checker: streetsidesoftware.code-spell-checker - コードやコメント内のタイポを検知してくれます。

settings.jsonの推奨設定

チームで開発効率を上げるため、VS Codeの設定を共有することをお勧めします。プロジェクトのルートディレクトリに.vscode/settings.jsonを作成し、以下の設定を記述します。

.vscode/settings.json
{
  "go.useLanguageServer": true,
  "[go]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "golang.go"
  },
  "gopls": {
    "ui.semanticTokens": true
  }
}

これにより、Goファイル保存時に自動でフォーマットが実行されるようになります。


3. LinterとFormatterの共通化

コードの品質と一貫性を保つため、静的解析ツール(Linter)とフォーマッターを導入します。

Formatter: goimports

gofmtはGoに標準で付属するフォーマッターですが、import文の自動整理も行ってくれるgoimportsの利用が推奨されます。

$ go install golang.org/x/tools/cmd/goimports@latest

VS CodeのGo拡張機能は、goimportsがインストールされていれば自動で利用してくれます。

Linter: golangci-lint

golangci-lintは、多くのLinterを内包した高速なメタLinterです。プロジェクトの規約を統一するために導入します。

# インストール
$ go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

プロジェクトルートに設定ファイル.golangci.ymlを配置することで、ルールをチームで統一できます。

.golangci.yml
run:
  timeout: 5m
  skip-dirs:
    - vendor

linters:
  enable:
    - gofmt
    - goimports
    - revive
    - govet
    - staticcheck
    - unused
    - errcheck

issues:
  exclude-rules:
    - path: _test\.go
      linters:
        - errcheck

この設定例では、代表的なLinterを有効化し、テストファイルでのエラーチェックを一部無効化しています。


4. Go Workspaces入門 - 新時代のモノレポ開発

Go 1.18から導入されたGo Workspacesは、複数のモジュールを同時に扱う開発を劇的に改善します。

なぜGo Workspacesが必要か?

従来、複数のローカルモジュールに依存するプロジェクト(モノレポ)では、go.modreplaceディレクティブを使って依存関係を解決する必要がありました。しかしこの方法は、go.modを直接編集するため、コミットすべきでない変更が紛れ込みやすいという問題がありました。
Go Workspacesは、go.workというワークスペース専用のファイルを導入することで、go.modを汚さずにローカルモジュール間の依存を解決します。

実践: greetingscliの2モジュール構成

実際に簡単なコマンドラインツールを作りながら、go workの使い方を体験してみましょう。

1. プロジェクトのセットアップ
まず、プロジェクト用のディレクトリを作成します。

$ mkdir go-work-example && cd go-work-example
$ mkdir greetings cli

2. greetingsモジュールの作成
greetingsディレクトリに移動し、Goモジュールを初期化して簡単な関数を実装します。

$ cd greetings
$ go mod init example.com/greetings

greetings.goを作成します。

greetings/greetings.go
package greetings

func Hello(name string) string {
	return "Hello, " + name
}

3. cliモジュールの作成
次に、cliディレクトリでgreetingsモジュールを利用するコマンドラインツールを作成します。

$ cd ../cli
$ go mod init example.com/cli

main.goを作成します。

cli/main.go
package main

import (
	"fmt"
	"example.com/greetings"
)

func main() {
	message := greetings.Hello("Go Workspaces")
	fmt.Println(message)
}

この時点では、example.com/greetingsはローカルにしか存在しないため、go getなどで依存を解決することはできません。

4. Go Workspacesの作成
プロジェクトのルートディレクトリに戻り、go workコマンドを実行します。

$ cd ..
$ go work init ./greetings ./cli

このコマンドは、go.workというファイルを生成し、ワークスペースで使用するモジュールを登録します。

go.work
go 1.24.5

use (
	./cli
	./greetings
)

useディレクティブに指定されたモジュールは、コンパイル時にローカルのソースコードが直接参照されるようになります。

5. 実行
ルートディレクトリからcliアプリケーションを実行してみましょう。

$ go run example.com/cli
Hello, Go Workspaces

go.modreplaceを書くことなく、cliモジュールがgreetingsモジュールを正しく見つけて実行できました。これがGo Workspacesの力です。


まとめ

今回は、Goの開発環境をゼロから構築し、Go Workspacesを使ってモダンなマルチモジュール開発の第一歩を踏み出しました。
重要なのは、LinterやFormatterといったツールを正しく設定し、チームで一貫した開発スタイルを保つことです。そしてGo Workspacesを活用すれば、モノレポ構成のプロジェクトもスマートに管理できます。

次回は、Goの基本文法を“Goらしい書き方”という観点からリフレッシュしていきます。お楽しみに!

GitHubで編集を提案

Discussion