💪

フロントエンドエンジニア、GO言語に入門する(環境構築してHello Worldまで)

2025/01/04に公開

今年はバックエンドの言語を触ってみたいと思い(昨年比)、GO と python を選択しました。
python は去年少し書いていたのと型がある言語が好きなので、今回は GO を始めてみました。

まずは環境構築して Hello World まで出来るようにします。
筆者の環境は以下のとおりです。

OS GO言語のバージョン エディタ
mac go1.23.4 darwin/arm64 VSCode

GO をインストール

まずは GO そのものをインストールします。
方法は以下の公式サイトから落としてくるか、 Homebrew 経由でできそうです。

公式サイトから

https://go.dev/dl/

Homebrewから

$ brew install go

https://formulae.brew.sh/formula/go

インストールできたか確認

とりあえずターミナルで go version と叩き、バージョン番号が出ることを確認します。

$ go version
go version go1.23.4 darwin/arm64

無事インストールできましたら、PATH を通していきます。

PATH を通す

筆者は zsh を使っているので、.zshrc に以下の内容を記述しました。
GOPATH モード用の記述をしているが、現行(1.16以降)ではモジュールモードがデフォルトなためあまり意識しなくてよさそう。

.zshrc
# go lang
export PATH=$PATH:/usr/local/go/bin

export GOPATH=$HOME/Documents/workspace/go
export PATH=$PATH:$GOPATH/bin

環境変数 GO111MODULEoff に設定すると GOPATH モードになる。
設定されている環境変数は go env コマンドで確認することができます。

$ go env | grep -i go111module
GO111MODULE=''

今回はデフォルトのモジュールモードで実行するので、特に触らないのでこのままにしておきます。

エディタ(VSCode) の設定

今回は普段使っている VSCode を使用します。

また、JetBrains 製の GO に特化した GoLand という IDE も存在します。
https://www.jetbrains.com/ja-jp/go/

拡張機能のインストール

なにはともあれ拡張機能をインストールしていきます。

まずは公式が出しているものを。
https://marketplace.visualstudio.com/items?itemName=golang.Go

インストールが完了しましたら、この拡張機能からもろもろのツールをインストールします。
VSCode を開いたまま shift + cmd + p でコマンドパレットを表示し、
Go: Install/Update tools と入力します。

インストールできるツールが選べるので、任意選択してインストールしてください。
筆者はとりあえずすべてインストールしました。


「Go: Install/Update tools」と入力すると出てくるパレット

フォーマッタ・リンタの設定など

こちらの記事を参考に設定しました。
ありがとうございます...!

https://zenn.dev/tellernovel_inc/articles/8a1ac1f1652605

記事中にもあるように、リンタに設定している golangci-lint は Homebrew 経由で落としてくる必要があります。
先に落としてから settings.json などを整えます。

$ brew install golangci-lint
.vscode/settings.json
{
  "editor.formatOnSave": true,
  "[go]": {
    "editor.defaultFormatter": "golang.go"
  },
  "go.useLanguageServer": true,
  "gopls": {
    "formatting.gofumpt": true
  },
  "go.lintTool": "golangci-lint",
  "go.lintFlags": ["--config=${workspaceFolder}/.golangci.yaml", "--fast"]
}
/.golangci.yaml
linters:
  disable-all: true
  enable:
    - gci

ちなみに、手動でのフォーマッタの実行は gofmt で整えることができます。
オプションをつけない場合は記述例をターミナルに出力するだけですが、-w オプションをつけることで自動で変換してくれます。

$ gofmt -w main.go

エディタの設定は完了です。

go mod

GO 言語はコードのパッケージ管理をするのにモジュールという概念があり、それぞれ一意の名前を持ちます。

go mod init <モジュール名> コマンドを実行すると、その名前で新しいモジュールを作成します。
このコマンドを実行すると、go.mod という依存関係を解決するファイルを生成します。

$ go mod init github.com/ユーザ名/モジュール名

モジュールのパスは一意にする

go mod など、GO 言語について検索していると、しばしば github.com/ユーザ名/モジュール名 のような形で記述する記事を見かけました。

GO のモジュールはインターネット上で一意の名前空間を持つ必要があるためなのと、モジュールの取得元を指定するためです。
例えば、github.com/ユーザ名/モジュール名 と記述しておけば、Go は github.com にアクセスし、そのリポジトリからモジュールを取得します。
他のホスティングサービス(例: GitLabや, Bitbucket)を使用する場合でも、同じ形式で指定することで、どこから取得すべきかを示すことができます。

https://pkg.go.dev/cmd/go#hdr-Remote_import_paths
https://qiita.com/qnighy/questions/bd41e92420d8ef133b18

また、自身が作成したモジュールの場合も衝突しない名前空間を設定することが望ましいです。

GO 言語はコンパイル言語なので、実行可能なバイナリを生成する際に事前にすべての依存関係を解決する必要があります。
そのためにこの仕組みが導入されているのですが、興味深いのはgo.modファイルを介すことで同じパッケージの異なるバージョンを共存させることが可能になっているようです。

https://qiita.com/TakanoriVega/items/6d7210147c289b45298a

そんなわけで go mod コマンドを実行します。

$ go mod init github.com/Shumpei0111/sample

自動で go.mod ファイルが生成されました。

/go.mod
module github.com/Shumpei0111/sample

go 1.23.4

Hello world

ようやく実行ファイルを作成します。
ターミナルにテキストを表示したいので、fmtを使います。

/main.go
package main

import "fmt"

func main() {
  fmt.Println("Hello World")
}

ファイルを作成したら、VSCode の「実行とデバッグ」から実行するか、ターミナルで go run コマンドを実行します。

$ go run main.go
Hello World

無事実行されました。

まとめ

一旦開発できるところまでやってこれました。
これから少しずつ触って仲良くなっていきたいと思います。
まずは構文の理解と非同期処理がなんとなく追えるところまでが目標です。

(どうでもいいけど公式サイトに行くときに golang.org にアクセスすると go.dev にリダイレクトするんですね)

参考

https://learn.microsoft.com/ja-jp/azure/developer/go/configure-visual-studio-code

Discussion