Skip to content

macOS に Golang をインストールする

以前に Golang 関連で幾つかメモを書きました。

過去のメモでも macOS へ Golang をインストールする際に Homebrew を利用していましたが、同時に環境変数なども設定していました。 今回は改めて、現時点での「macOS への Golang インストール手順」をメモしておきます。

検証環境

今回は以下の環境で検証を行いました。

  • M1 Chip で動作している mac
  • macOS Sonoma 14.2

Homebrew でインストールする

結論から述べると「Homebrew でインストール」してしまえば、「環境変数の設定」など、その他特別な設定は原則不要です。

1
brew install go

go コマンドが下記へインストールされました。

1
2
$ which go
/opt/homebrew/bin/go

現時点ではバージョン 1.21.5 がインストールされました。

1
2
$ go version
go version go1.21.5 darwin/arm64

Golang のバージョンを切り替える必要は無い

例えば Python ではランタイムのバージョンを意識する必要があり、プロダクトによってバージョンを切り替えて作業を行う場合があります。 しかし、Golang ではあまりこういった必要がありません。 You don't need virtualenv in Go では下記のようにされています。

There are multiple, mutually-incompatible versions of Python out in the wild. There are even multiple versions of the packaging tools (like pip). On top of this, different programs need different packages, often themselves with mutually-incompatible versions.

Python code typically expects to be installed, and expects to find packages it depends on installed in a central location. This can be an issue for systems where we don't have the permission to install packages/code to a central location.

All of this makes distributing Python applications quite tricky. It's common to use bundling tools like PyInstaller, but virtualenv is also a popular option [1].

Go is a statically compiled language, so this is a non-problem! Binaries are easy to build and distribute; the binary is a native executable for a given platform (just like a native executable built from C or C++ source), and has no dependencies on compiler or package versions. While you can install Go programs into a central location, you by no means have to do this. In fact, you typically don't have to install Go programs at all. Just invoke the binary.

It's also worth mentioning that Go has great cross-compilation support, making it easy to create binaries for multiple OSes from a single development machine.

それでも「どうしてもランタイムのバージョンを切り替えたい」場合は、公式サイトの Installing multiple Go versions に記載されている手順に従います。

環境変数の設定は原則不要

go env を実行すると、Golang が内部的に参照している環境変数の一覧が表示されます。 明示的に OS (シェル) 側で設定することにより、これらの値を上書きすることが可能です。 ですが、「OS 側で明示的に設定していなくても、必要な環境変数が一式定義されている」ことが読み取れます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$ go env
GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/USERNAME/Library/Caches/go-build'
GOENV='/Users/USERNAME/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/USERNAME/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/USERNAME/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/opt/homebrew/Cellar/go/1.21.5/libexec'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/opt/homebrew/Cellar/go/1.21.5/libexec/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.5'
GCCGO='gccgo'
AR='ar'
CC='cc'
CXX='c++'
CGO_ENABLED='1'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/ln/152fs2h93ps9pnk8xj9bykjc0000gn/T/go-build192640021=/tmp/go-build -gno-record-gcc-switches -fno-common'

以前は Golang のインストールに GOPATHGOROOT.bash_profile などで定義させる手順をよく見かけました。 ですが、現状では必要な環境変数は例えば GOROOT='/opt/homebrew/Cellar/go/1.21.5/libexec'GOPATH='/Users/USERNAME/go' のように定義済みであり、改めて再定義する必要が無いことが分かります。

尚、GOROOT は Golang の SDK の位置を、GOPATH は作業ディレクトリを指定しています。 GOPATH については公式サイトの How to Write Go Code に記載されています。

チュートリアルを試す

Golang の公式チュートリアルは Tutorial: Create a Go module にあります。 多少ソースコードを簡単にしたチュートリアルの要点は以下の通りです。

まず、作業用ディレクトリを作成したら go mod init します。

1
2
3
mkdir greetings
cd greetings
go mod init example.com/greetings

次にソースコードを用意します。 今回は greetings.go というファイルを以下の内容で新規作成しました。

greetings.go
1
2
3
4
5
6
7
package main

import "fmt"

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

go run で実行します。

1
2
$ go run greetings.go
Hello, World!