なぜ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 versiongo mod initgo fmtgo vetgo build
  • 生成されたバイナリの実行
  • fmt.Printlnfmt.Printf
  • :=varconst
  • slice の len / cap
  • mapstruct

まだ「Go分かった」と言える状態では全然ないです。ただ、ここまで触るだけでも「あー、違う言語を触るってこういうことか」と思うところがありました。

分けて読めるようにした

まず入口で全体像を見る

この記事では、動機、環境、何を見たかだけを残します。細かい説明は、次の記事からテーマごとに分けました。

  1. Goのhello-worldで、fmt/vet/buildの流れを触る
  2. fmt.Printlnとfmt.Printfの違いを最初に整理する
  3. Goの :=varconst で型と変更可否を見る
  4. Goのsliceで lencap、copyの感覚を掴む
  5. 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 versiongo mod initgo fmtgo vetgo build: Go CLI(公式
  • fmt.Println / fmt.Printf: fmt パッケージ(公式
  • len / cap / append / copy / make / print / println: 組み込み関数(公式
  • :=varconst、slice、map、struct: Go言語仕様(公式
  • JSONの json:"name" のようなタグや変換: encoding/json公式