なぜGoを触り始めたのか
Python で困っていたわけではない
最近、Goを勉強し始めました。
これまで自分が書いてきたものは、かなりPython寄りです。PythonならAPIも書けるし、ローカルのちょっとした自動化もすぐ作れます。なので、次にAPIを作るとしても、そのままPythonで進める選択肢は普通にあります。
ただ、今回はいきなりAPIを書き始める前に、一度Goを触ってみることにしました。理由は「Pythonが嫌になった」ではなく、APIを運用するところまで考えたときに、別の言語の前提も見ておきたくなったからです。
PythonでAPIを書くこと自体はできます。FastAPIやFlaskもあります。ただ、APIを運用するところまで想像すると、少し見え方が変わりました。
API 前に見ておきたかったこと
- ライブラリ選びや依存関係をどう見るか
- サプライチェーンや実行環境をどこまで気にするか
- デプロイ後の運用保守で何が効いてくるか
- 型、コンパイル、メモリ、コピーの話をもう少し自分で分かりたい
特に最後の「メモリやコピーの話」は、ずっと分かるようで分かっていませんでした。CやC++を書いている人が「この処理はどこでメモリ持ってるんですか?」とか「ここでコピー走りますよね?」と話しているのを聞くたびに、なんとなく分かったふりをしていた気がします。
この記事は「GoでAPIを作りました」ではなく、「APIを書く前にGoを少し触って、Pythonとの違いが見え始めた」という段階の入口です。元々は1本の記事に全部を書いていましたが、読み切るには長くなっていたので、論点ごとに分けました。
今回の環境
ローカル環境
今回ローカルで確認した環境は次の通りです。
- Go:
go1.25.7 - OS / Arch:
darwin/arm64 - 確認コマンド:
go version
Goのバージョンまわりだけは前提として、Go 1.25 Release Notes(公式)と Release History(公式)を確認しました。
このシリーズで扱う範囲
今回見たのは、かなり基本的なところです。
go version、go mod init、go fmt、go vet、go build- 生成されたバイナリの実行
fmt.Printlnとfmt.Printf:=、var、const- slice の
len/cap mapとstruct
まだ「Go分かった」と言える状態では全然ないです。ただ、ここまで触るだけでも「あー、違う言語を触るってこういうことか」と思うところがありました。
分けて読めるようにした
まず入口で全体像を見る
この記事では、動機、環境、何を見たかだけを残します。細かい説明は、次の記事からテーマごとに分けました。
- Goのhello-worldで、fmt/vet/buildの流れを触る
- fmt.Printlnとfmt.Printfの違いを最初に整理する
- Goの
:=、var、constで型と変更可否を見る - Goのsliceで
len、cap、copyの感覚を掴む - APIを書くならmapよりstructで形を決める
1記事1論点にする
最初の1本に、初期セットアップ、fmt、変数宣言、slice、map / struct、Pythonとの使い分けを全部入れていたので、読んでいる途中で論点が何度も変わっていました。
今は「今日は fmt だけ見る」「今日はsliceの len / cap だけ見る」のように、1回で読む範囲を選びやすくする方がよさそうです。
次はhello-worldから
小さいコードで入口を触る
最初にやったのは、Goを入れて、hello-worldを動かすところでした。かなり小さいコードですが、この時点でPythonとは入口の感触が少し違いました。
続きは Goのhello-worldで、fmt/vet/buildの流れを触る に分けました。
今回見た公式リンクまとめ
- Goのインストール手順: Download and install(公式)
- 最初のhello-worldチュートリアル: Tutorial: Get started with Go(公式)
go version、go mod init、go fmt、go vet、go build: Go CLI(公式)fmt.Println/fmt.Printf:fmtパッケージ(公式)len/cap/append/copy/make/print/println: 組み込み関数(公式):=、var、const、slice、map、struct: Go言語仕様(公式)- JSONの
json:"name"のようなタグや変換:encoding/json(公式)