hello-worldで入口を触る
まず小さいコードから始める
前回 は、Python中心だった自分がGoでAPIを書く前に何を見たかったのかを整理しました。
ここでは、最初に触ったhello-worldの流れだけを切り出します。Goを入れて、moduleを作り、hello.go を書き、go fmt、go vet、go build を通して、最後にバイナリを実行するところまでです。
Pythonだと、まず hello.py を書いて python hello.py で動かす感覚が強いです。Goにも go run はありますが、今回自分が「おお」と思ったのは、go 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 init は go コマンドの一部なので、細かい挙動は 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 build も go コマンドの一部です。詳しいオプションは Go CLI(公式)にありますが、まずは実行ファイルができることを体験するだけでも十分でした。
hello-world というバイナリができたら、こう実行します。
./hello-world
この「コンパイルして、できたバイナリを実行する」という流れが、かなり新鮮でした。
Pythonとは入口の感触が違う
ビルドしてから実行する体験
Pythonでは、ざっくり言えばソースコードをインタプリタに渡して動かす感覚です。一方でGoは、先にビルドして実行ファイルを作り、それを動かします。
細かい実行モデルの話はいったん置いておくとしても、「自分が書いたコードがバイナリになる」というのは、触ってみるとけっこう違う体験でした。
APIを書く前でも、この流れを一回触っておくと、Goがどういう前提で動く言語なのか少し見えます。go fmt で整えて、go vet で見て、go build で固めて、バイナリを実行する。ここだけでも、Pythonとは違う場所に来た感じがありました。
次は fmt.Printlnとfmt.Printfの違いを最初に整理する に進みます。