お金をかけずにサーバーの勉強をしよう

Goインストール

2024年1月28日

メニューへ戻る

Google謹製開発言語の Goを Ubuntu 22.04にインストールします。

少し Rust に水を開られて来たかなぁと思われますが、Goもインストールしないと不公平というものです。

Goの本家サイトはこちら。
Go

Goというと、私には当ホームページで扱ったチャットツールの Mattermost がこれで作られているというくらいの認識しかありませんでした。

泣く子も黙る Google製の開発言語で、実際にこれで作られたプロダクトが多く使われておりますし、お金を扱う箇所でも使われているのは信頼性の高さの証左なんでしょう。

それでは四の五の言わずに開発環境を作っていきましょう。


1.環境

私の個人的な便器上 Ubuntu Server 22.04.3に入れますが、Desktopでも何も変わらないでしょう。

2024年1月28日時点での最新版は 1.21.6です。


2.インストール

インストール手順は以下にあります。
Download and install
この手順に従ってインストールをしていきます。

と言いたいところなのですが、手順を見ると [tar.gz]形式での配布になっていて、パッケージじゃないんですね。

Ubuntuの公式リポジトリにパッケージはないのかな?と。

subro@UbuntuServer2204-1:~$ go
コマンド 'go' が見つかりません。次の方法でインストールできます:
sudo snap install go         # version 1.21.6, or
sudo apt  install golang-go  # version 2:1.18~0ubuntu2
sudo apt  install gccgo-go   # version 2:1.18~0ubuntu2
他のバージョンについては 'snap info go' を確認してください。

snapパッケージなら最新版か…。
パッケージの最新版への追いつき具合は悪く無さげ。

snapなのが若干引っかかりますが、Ubuntuの船から降りる気はなく一蓮托生ということで snapパッケージでの導入をすることに腹決めします。

subro@UbuntuServer2204-1:~$ sudo snap install go
error: This revision of snap "go" was published using classic confinement and thus may perform
       arbitrary system changes outside of the security sandbox that snaps are usually confined to,
       which may put your system at risk.

       If you understand and want to proceed repeat the command including --classic.

「だからこういうのよせよ!」って思います。
snapの制限とか覚悟して腹を決めたのに…。
snapは説明の時点で「classicもOKよ」って表示しておいてくれないものか…。

では改めて classicモード(旧来のインストール場所に入る)でインストールを。

subro@UbuntuServer2204-1:~$ sudo snap install go --classic
go 1.21.6 from Canonical✓ installed

インストールできました。
[/snap/bin/go] というシンボリックリンク([/usr/bin/snap]ファイルを指している)ができています。


3.チュートリアルをやってみる

Hello Worldのチュートリアルがありますので、それをやってみましょう。
Tutorial: Get started with Go

「Prerequisites」「Install Go」の段落は済んでいるので、「Write some code」という段落からやっていきます。

ワーキングディレクトリは [~/work/go/hello] とします。

次の手順は「3.Enable dependency tracking for your code.」ですけれども、他のパッケージの呼び出しのようです。

[go.mod]ファイルでパッケージ管理をするので、go mod init コマンドでそのファイルの初期化をするのですね。

subro@UbuntuServer2204-1:~/work/go/hello$ go mod init example/hello
go: creating new go.mod: module example/hello

こんな中身のファイルができました。

subro@UbuntuServer2204-1:~/work/go/hello$ cat go.mod
module example/hello

go 1.21.6

「チュートリアルなのでモジュール名を『example/hello』にしているけど、本当の開発ではレポジトリの URLを書くんだよ。」と言うような内容がチュートリアルには書いてあります。

以下の内容で [hello.go]ファイルを作ります。

package main

import "fmt"

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

Java・C#・Rust・Javascript、皆似たような感じなので、何となく何をしているのかは分かります。

では実行しましょう。

subro@UbuntuServer2204-1:~/work/go/hello$ go run .
Hello, World!

うまく実行できたようですが、読み込んだ外部パッケージはどこに行ったんでしょうか。
ホームディレクトリの下に [go]ディレクトリができていました。

subro@UbuntuServer2204-1:~/work/go/hello$ tree -a ~/go
/home/subro/go
└── pkg
    └── mod
        └── cache
            └── lock

3 directories, 1 file

これでチュートリアルは終わりです。


4.ビルドして実行ファイルを作る

あれっ? Goってコンパイル言語じゃなかったか? バイナリファイルができてるのかとプロジェクトのディレクトリを見てみます。

subro@UbuntuServer2204-1:~/work/go/hello$ ls -l
合計 8
-rw-rw-r-- 1 subro subro 32  1月 28 17:53 go.mod
-rw-rw-r-- 1 subro subro 78  1月 28 18:00 hello.go

ありませんね…。
go run コマンドはコンパイルなしに、インタプリタとして実行できるんでしょうね。

だけど運用時のデプロイは実行ファイルを使うはずです。

ビルドをしてみます。

subro@UbuntuServer2204-1:~/work/go/hello$ go build hello.go

subro@UbuntuServer2204-1:~/work/go/hello$ ls -l
合計 1768
-rw-rw-r-- 1 subro subro      32  1月 28 17:53 go.mod
-rwxrwxr-x 1 subro subro 1801266  1月 28 18:54 hello
-rw-rw-r-- 1 subro subro      78  1月 28 18:00 hello.go

今度は [hello]ファイルができました。
これを実行してみます。

subro@UbuntuServer2204-1:~/work/go/hello$ ./hello
Hello, World!

Hello, World! と表示されました。


==========
環境構築としてはここまでで良いと思います。
Dockerなどのコンテナで作る場合は、ワーキングディレクトリだけでなく、モジュールを保持している [~/go]ディレクトリも永続化させておかないといけませんね。

なお Goのお試し実行環境 WEB版が以下の URLで提供されているので、そこで遊んでみるのも良さそうですよ。
The Go Playground

もっと突っ込んだチュートリアルが以下に用意されていますので、そちらで学んでみるのも良いでしょう。
Documentation

Wikiによれば、作者が C++が嫌で作ったということなので、C++の面倒なところを無くしながら C++並の開発効率を得られるようになってるのだと思います。

比較的 C言語に近い文法らしいので、Cプログラマの人は取っ付き易いのではないでしょうか。
そしてこの辺が Rustと競合している理由なのかも知れません。

本家サイトの Documentationのページを見る限りかなり充実していて、「A Tour of Go」って箇所なんかローカルに教育環境をインストールできるやつもありました。
これはなかなか素晴らしいと思います。

これを機に Goでの開発に乗り出してみてはいかがでしょうか。


人気の言語なんでいっぱいありますよ〜。