hello-worldで入口を触る

まず小さいコードから始める

前回 は、Python中心だった自分がGoでAPIを書く前に何を見たかったのかを整理しました。

ここでは、最初に触ったhello-worldの流れだけを切り出します。Goを入れて、moduleを作り、hello.go を書き、go fmtgo vetgo build を通して、最後にバイナリを実行するところまでです。

Pythonだと、まず hello.py を書いて python hello.py で動かす感覚が強いです。Goにも go run はありますが、今回自分が「おお」と思ったのは、go build でバイナリを作って、それを直接実行する流れでした。

Go の hello-world で触る最初の流れ go mod init でmoduleを作り、hello.goを書き、go fmtとgo vetで確認し、go buildでバイナリを作って実行する流れ hello-world で見る範囲 go mod init module を作る hello.go 小さいコード fmt / vet 整形と確認 build 実行ファイルへ この記事では、Goを書く前の準備ではなく、最初のファイルを整えて固める流れを見る。
Go の hello-world では、module 作成、コード作成、整形・確認、build / 実行を一連の流れとして触る。

手元の環境

今回ローカルで確認した環境は次の通りです。

  • Go: go1.25.7
  • OS / Arch: darwin/arm64
  • 確認コマンド: go version

Goを入れてmoduleを作る

Step 1. Goをインストールしてバージョンを見る

インストールは公式の Download and install(公式)を見て進めました。OSによって手順が違うので、細かい手順は公式に寄せたほうがよさそうです。

自分の環境では、インストール後にまずこれを確認しました。

go version

ここでバージョンが出ると、ひとまずGoは動かせそうです。

Step 2. hello-world用のmoduleを作る

次に、hello-world という小さい練習用ディレクトリを作り、その中でmoduleを作りました。

go mod init hello-world

Goでは、依存関係などを管理する単位としてmoduleを使います。go mod initgo コマンドの一部なので、細かい挙動は Go CLI(公式)を見るのがよさそうです。

最初は少し大げさに見えますが、APIを書く前提で考えると、プロジェクトの入口を作っている感じです。

hello.goを書いて整える

Step 3. hello.goを書く

この中に hello.go を置いて、まずは本当に小さいコードを書いてみました。おなじみのhello-worldです。

package main

import "fmt"

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

Go公式にも最初のhello-worldチュートリアル(公式)があります。この記事では、その流れを自分の学習メモとして噛み砕いています。

このあたりで、Pythonとは少し入口が違うなと思いました。Pythonだと、まず hello.py みたいなファイルを書いて、python hello.py で動かす感覚が強いです。

Step 4. go fmtでコードを整える

まず、書いたコードを整えます。

go fmt ./

go fmt の中で使われる整形処理は gofmt公式)です。

ここで、ファイルが空だったり、package main がなかったりして、Goのファイルとして読めない状態だとちゃんと怒られます。

Pythonだと「実行して、その行に来たら分かる」ことが多い感覚があります。Goはもう少し手前で止めてくれる場面があるんだな、という印象でした。

vetしてbuildする

Step 5. go vetで静的に見る

さらに、静的に変なところがないかを見るために go vet もあります。

go vet ./

go vet は静的に怪しいところを見つけるためのコマンドです(公式)。

たとえば fmt.Printf(i) のように、Printf の第1引数へフォーマット文字列ではない値を渡している場合は、このあたりで見つかります。自分が最初に引っかかったところでもあります。

Step 6. go buildでバイナリを作る

そしてビルドします。

go build

go buildgo コマンドの一部です。詳しいオプションは Go CLI(公式)にありますが、まずは実行ファイルができることを体験するだけでも十分でした。

hello-world というバイナリができたら、こう実行します。

./hello-world

この「コンパイルして、できたバイナリを実行する」という流れが、かなり新鮮でした。

Pythonとは入口の感触が違う

ビルドしてから実行する体験

Pythonでは、ざっくり言えばソースコードをインタプリタに渡して動かす感覚です。一方でGoは、先にビルドして実行ファイルを作り、それを動かします。

細かい実行モデルの話はいったん置いておくとしても、「自分が書いたコードがバイナリになる」というのは、触ってみるとけっこう違う体験でした。

APIを書く前でも、この流れを一回触っておくと、Goがどういう前提で動く言語なのか少し見えます。go fmt で整えて、go vet で見て、go build で固めて、バイナリを実行する。ここだけでも、Pythonとは違う場所に来た感じがありました。

次は fmt.Printlnとfmt.Printfの違いを最初に整理する に進みます。