フロントエンドエンジニア、GO言語に入門する(環境構築してHello Worldまで)
今年はバックエンドの言語を触ってみたいと思い(昨年比)、GO と python を選択しました。
python は去年少し書いていたのと型がある言語が好きなので、今回は GO を始めてみました。
まずは環境構築して Hello World
まで出来るようにします。
筆者の環境は以下のとおりです。
OS | GO言語のバージョン | エディタ |
---|---|---|
mac | go1.23.4 darwin/arm64 | VSCode |
GO をインストール
まずは GO そのものをインストールします。
方法は以下の公式サイトから落としてくるか、 Homebrew 経由でできそうです。
公式サイトから
Homebrewから
$ brew install go
インストールできたか確認
とりあえずターミナルで go version
と叩き、バージョン番号が出ることを確認します。
$ go version
go version go1.23.4 darwin/arm64
無事インストールできましたら、PATH を通していきます。
PATH を通す
筆者は zsh を使っているので、.zshrc
に以下の内容を記述しました。
GOPATH モード用の記述をしているが、現行(1.16以降)ではモジュールモードがデフォルトなためあまり意識しなくてよさそう。
# go lang
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/Documents/workspace/go
export PATH=$PATH:$GOPATH/bin
環境変数 GO111MODULE
を off
に設定すると GOPATH モードになる。
設定されている環境変数は go env
コマンドで確認することができます。
$ go env | grep -i go111module
GO111MODULE=''
今回はデフォルトのモジュールモードで実行するので、特に触らないのでこのままにしておきます。
エディタ(VSCode) の設定
今回は普段使っている VSCode を使用します。
また、JetBrains 製の GO に特化した GoLand という IDE も存在します。
拡張機能のインストール
なにはともあれ拡張機能をインストールしていきます。
まずは公式が出しているものを。
インストールが完了しましたら、この拡張機能からもろもろのツールをインストールします。
VSCode を開いたまま shift + cmd + p
でコマンドパレットを表示し、
Go: Install/Update tools
と入力します。
インストールできるツールが選べるので、任意選択してインストールしてください。
筆者はとりあえずすべてインストールしました。
「Go: Install/Update tools」と入力すると出てくるパレット
フォーマッタ・リンタの設定など
こちらの記事を参考に設定しました。
ありがとうございます...!
記事中にもあるように、リンタに設定している golangci-lint
は Homebrew 経由で落としてくる必要があります。
先に落としてから settings.json などを整えます。
$ brew install golangci-lint
{
"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"]
}
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)を使用する場合でも、同じ形式で指定することで、どこから取得すべきかを示すことができます。
また、自身が作成したモジュールの場合も衝突しない名前空間を設定することが望ましいです。
GO 言語はコンパイル言語なので、実行可能なバイナリを生成する際に事前にすべての依存関係を解決する必要があります。
そのためにこの仕組みが導入されているのですが、興味深いのはgo.mod
ファイルを介すことで同じパッケージの異なるバージョンを共存させることが可能になっているようです。
そんなわけで go mod
コマンドを実行します。
$ go mod init github.com/Shumpei0111/sample
自動で go.mod
ファイルが生成されました。
module github.com/Shumpei0111/sample
go 1.23.4
Hello world
ようやく実行ファイルを作成します。
ターミナルにテキストを表示したいので、fmt
を使います。
package main
import "fmt"
func main() {
fmt.Println("Hello World")
}
ファイルを作成したら、VSCode の「実行とデバッグ」から実行するか、ターミナルで go run
コマンドを実行します。
$ go run main.go
Hello World
無事実行されました。
まとめ
一旦開発できるところまでやってこれました。
これから少しずつ触って仲良くなっていきたいと思います。
まずは構文の理解と非同期処理がなんとなく追えるところまでが目標です。
(どうでもいいけど公式サイトに行くときに golang.org にアクセスすると go.dev にリダイレクトするんですね)
参考
Discussion