今からGoを始めるなら僕ならこうする話

要約
Goは継承も例外もクラスもない、シンプルさに振り切った言語です。Google発で、無駄なく書けてチームで読みやすいのが強み。今から始める人向けに、これをサクッとイメージ掴んで開発できる一歩目になれるように解説します。
意見はこのエリアに表示されます

はじめに

「Goが書けると単価が高いらしい」「バックエンドやインフラまわりで最近名前見るようになった」——そのあたりが気になってGoを調べ始めた人、多いんじゃないかと思っています。実際、普段使っている Docker や、Kubernetes,Terraform といったツールも中身はGoで書かれていて、クラウドやインフラの領域ではかなり存在感がでてきた最近の言語です。

単純に求人が増えているのもありますが、個人的にGoが面白いと思うのは、クラウドネイティブみたいな新しめのIT領域と相性がいいわりに、まだ書ける人が少ないところです。専門性が高くて人材が希少なぶん、単価も高くなりやすい傾向にあります。

ただ、いざ触ろうとすると「クラスがないらしい」「例外(try-catch)がないらしい」みたいな話が出てきて「なんか今までのが通用しなさそう」と感じた方も一定数いたはず。僕も最初は「クラスないってどういうこと…?」と戸惑いました。(一応公式サイト貼っておきます)

先に言っておくと、GoはGoogleが作った、設計思想を「とにかくシンプルに」へ振り切った言語です。覚えることはむしろ少ないので、身構えなくて大丈夫です。この記事では、「全部完璧に理解する」のは一旦置いておいて、今からGoを触るなら、最低限ここだけ押さえれば動かせて、しかもGoらしく書けるというラインを、実際にコードを書きながらやっていきます。

Goってこんなかんじ

この記事の対象者

  • サクッとGoの全体像を掴みたい
  • 他の言語は少し触ったけどGoは初めて
  • クラウド・バックエンド・CLIツールでGoを使うことになった
  • 「クラスがない」「例外がない」と聞いて身構えている

この記事の概要

Goは継承・例外・クラスをあえて持たない、シンプルさに振り切った言語です。今から始めるなら、次の順番で触っていくとかなりサクッと習得できます(僕がやったルートです)。

  • 環境は go mod init で初期化して、go run で動かす(使ってない変数・importはエラーになる点に注意)
  • ループは for だけ、後始末は defer で予約する
  • 例外はなく、if err != nil でその場でエラーを確認するのがGo流っぽい
  • クラスの代わりに構造体(struct)、機能は**メソッド(レシーバ)**でひもづける
  • インタフェースは implements を書かない暗黙的な実装。メソッドが揃えば同じ型として扱える
  • 並行処理(goroutine・channel)がメイン機能だが、入門では存在を知るだけで十分です

このうち構造体・インタフェース・if err != nil の3つに慣れれば、世の中のGoコードは大体読めるようになります。以下、各項目を実際にコードを書きながら見ていきます。

Goってどういう言語か

Goが大事にしているのは、とにかくシンプルであることです。必要なことを無駄なく書けて、チームで読みやすく、運用しやすいコードになる——そこを狙って設計されています。実行が速く、ビルドすると1つの実行ファイル(シングルバイナリ)にまとまるので配布が楽、というのも大きな特徴です。

他の言語にある「継承」「例外処理」「クラス」がありません。最初は「えっ、それで困らないの?」となるんですが、ルールが少ないぶん、誰が書いてもコードが似た形になって、チームで書いてもブレにくいんですよね。今回ここは深掘りしませんが、「機能を削ってシンプルさに全振りした言語」くらいの理解で一旦OKです。

ちなみに2026年6月時点の最新はGo 1.26です。この記事で扱う基礎の部分はバージョンでほとんど変わらないので、バージョン気にせず読み進めてもらって大丈夫です。

環境準備:Goを入れて動かす

まずはGoを書いて動かす準備です。

Goを入れる

公式サイトのインストーラーを使うのが一番手っ取り早いです。

Goのダウンロード画面

入れ終わったら、ターミナル(WindowsならコマンドプロンプトやPowerShell)で次を打って、バージョンが出れば成功です。

エディタは、補完や整形が効く VS Code+Go拡張 を入れておくのが無難です。

VSCodeでGo拡張1
VSCodeの拡張機能で「Go」を検索して「install」する
VSCodeでGo拡張2
その場で「Ctrl + Shift + P」を押してこれを選択
VSCodeでGo拡張3
全部にチェックつけて「OK」押す

これによりVSCode上でGo公式が作った「Goを動かすためのツール一式」をインストールすることができました。

プロジェクトを作る(go mod init)

Goでは、プロジェクトのフォルダを作ったら、最初に go mod init でそのプロジェクトを初期化します。これでライブラリ管理などがまとまる go.mod というファイルができます。イメージとしては「ここをGo作業地とする!」という感覚でOKです。

※ 昔のGoは GOPATH という決まったフォルダにコードを置く必要があって、ここが初心者が躓いていました。今は go mod のおかげで好きな場所にプロジェクトを置けます。古い記事だとGOPATHの話が出てきますが、今は気にしなくて大丈夫です。

example.com/otameshi ←このプロジェクトの名前になります。
厳密にはコードの取得元URLに当たりますが今回別に公開することもないので公開しない練習用としてexample.comのように適当でOKです。

Hello Worldを動かす

さっき作成したotameshiフォルダーの中に main.go というファイルを作って、次を書きます。

ターミナルで次を実行して、Hello, World! と出れば成功です。

go run は「その場でコンパイルして即実行」、go build は「実行ファイルを作る」コマンドです。細かくいうと、配布用の1個のファイルを作りたいときは go build、開発中にサッと動かしたいときは go run、と使い分けますが、そんなの難しいので今は「とりあえずgo runで実行する」で一旦OKです。

ここで、Goを触り始めた人がほぼ全員ハマるポイントを先に潰しておきます。

使っていない変数・importがあると、コンパイルが通りません。多くの言語では「未使用でも警告止まり」ですが、Goはエラーにして止めます。「動かない!」のNo.1がこれなので、エラーが出たら「使ってない変数とかimportが残ってないか」をまず疑ってください。正直おせっかいですが、これも「コードを綺麗に保つ」Goの思想です。

まずは全体像把握

細かい話に入る前に、この記事で扱う範囲をざっと並べておきます。今は「そんなのあるんだ」でOKです。次の章から1つずつ実際にやりながら解説します。

概念ひとことで言うと
変数と型var:= の2通りの書き方がある
forループは for 1種類だけ(while とかない)
defer関数の終わりに必ず実行する処理を予約する
エラーハンドリング例外はなく、関数が「結果とエラー」をペアで返す
構造体(struct)複数のデータをまとめる型。クラスの代わり
メソッド・インタフェース型に機能をひもづける/implementsを書かない暗黙的な実装
ポインタ値そのものを渡すか、置き場所(アドレス)を渡すか
goroutine・channel並行処理。Goの代名詞的な機能

このうち未経験者じゃなくて、他の言語から来た人が一番面食らうのがエラーハンドリングif err != nil)と構造体・インタフェース(クラスがない設計)です。逆にここに慣れればGoのほとんどはスラスラできちゃいます。では順にやっていきましょう。

基本文法とGoらしいところ

まずは土台の文法を、Go独特の部分も含めて押さえていきます。

変数:var と :=

Goの変数宣言は2通りあります。

実際のコードでは、関数の中では := を使うことがほとんどです。var は「関数の外で宣言したいとき」とか「最初は値を入れず型だけ決めたいとき」に使うぐらいなイメージです(僕の個人的感覚です)。

ループは for だけ

Goには while がありません。繰り返しは全部 for で書きます。正直僕は最初「forEachとかないのキツ」と思っちゃいましたがこれはこれでいいかもです。

defer:終わったときに必ず実行する

defer は、その関数が終わるときに必ず実行したい処理を予約しておく仕組みです。ファイルを開いたら必ず閉じる、みたいな「後始末」を書くのに使います。

ファイルやデータベース接続を開いたとき、その直後に defer file.Close() と書いておくと、「閉じ忘れ」を防げます。開いたらすぐ閉じる処理を予約しておく、というのがGoの定番の書き方っぽいです。

エラーハンドリング:if err != nil

ここがGoで一番「他の言語と違うわ」となるところです。Goには try-catch のような例外処理がありません。代わりに、関数が「結果」と「エラー」の2つをまとめて返します

ポイントは、戻り値が「結果」と「エラー」の2つあることです。成功したらエラーに nil、失敗したらエラーに中身を入れて返します。呼ぶ側はこう書きます。

この if err != nil { ... } が、Goを書いていると本当に何度も出てきます。最初のうちは「毎回これ書くの、くどくない?」と思うんですよね。僕も最初そう感じました。でも、エラーが起きうる場所がコード上ではっきりできるので、慣れると「try-cahchで下に挟むよりエラー処理コンパクトにできる」感あって、これはこれで安定感出ます。

Goでは、エラーは「投げる」ものじゃなく「戻り値として受け取って、その場で確認する」もの。この感覚さえ掴めれば、Goのコードはぐっと読めるようになります。

構造体とインタフェース(クラスのない設計)

「クラスがないなら、どうやってデータと機能をまとめるの?」——その部分が、構造体(struct)とインタフェース(interface)です。Goの設計の山場なので、ここは少し丁寧にいきます。

Goの構造体とインタフェース

構造体(struct)

構造体は、複数のデータを1つにまとめた型です。Javaでいうクラスから「機能」を抜いて「データの入れ物」にしたもの、とイメージするとわかりやすいです。

※ フィールド名が大文字始まりName, Age)になっている通り、Goでは大文字始まりが外のパッケージからも使える(公開)」、小文字始まりがそのパッケージ内だけ(非公開)」というルールです。Javaの public/private を、キーワードじゃなく「頭文字の大小」で表している、と思えばOKです。

メソッド(レシーバ)

構造体に機能(メソッド)をひもづけることもできます。関数名の前に「どの型のメソッドか」を書くのが特徴で、この部分をレシーバと呼びます。

レシーバには「値レシーバ (u User)」と「ポインタレシーバ (u *User)」の2種類があります。構造体の中身を書き換えたいときはポインタレシーバを使う、という違いがありますが、これは次のポインタの章とつながるので、今は「2種類ある」とだけ覚えておけば十分です。

インタフェース(interface)

ここもGoらしさが出てるなと個人的に感じる部分です。インタフェースは「こういうメソッドを持っていますよ、という約束」を定義したものです。

ここで一番大事なポイント。DogCat も、どこにも「Animal を実装します」と書いていません。多くの言語では implements Animal のような宣言が必要ですが、Goは違います。Naku() string というメソッドさえ持っていれば、自動的に Animal として扱えます。これを暗黙的なインタフェース実装(ダックタイピング)と言います。

何がうれしいかというと、呼び出す側は「Animal(=Naku()できるやつ)」とだけ思っていればよくて、中身が犬か猫かを気にしなくていい。後から「鳥」を足したくなっても、Naku() を持った型を作るだけで、呼び出し側のコードは一切変えずに済みます。「同じメソッドを持つものは、同じ型として扱える」——この発想がGoの設計のキモです。

ここは初見だとピンと来づらいところですが、「メソッドさえ揃っていれば仲間として扱える」という感覚だけ持ってもらえれば十分です。

ポインタ

Goにはポインタがあります。「値そのものを渡す(値渡し)」のか「値が置いてある場所=アドレスを渡す(ポインタ(参照)渡し)」のか、という話です。

これは、関数に渡した変数を書き換えたいかどうかで効いてきます。

&x が「xの置き場所」、*n が「その置き場所の中身」です。記号が出てくると身構えますが、書き換えたいときは &* を使ってポインタで渡す、くらいの理解でまずは十分です。

C言語などと違って、Goのポインタはポインタ演算(アドレスを足し引きする操作)ができません。そのぶん危ない使い方ができないようになっていて、安全に扱えるのもGoの特徴です。

並行処理(goroutine と channel)

Goといえばこれ、というメイン機能が並行処理です。技術選定でGoを選ぶ理由の半分ぐらいはこれ使いたいからでしょう。ただ、ここは入門で深掘りすると一気に沼るので、「こういうことできる」を知っておくくらいにとどめます。必要になってから勉強すれば大丈夫です。

goroutine

複数の処理を同時に進めたいとき、関数の前に go を付けるだけで、その処理を並行して動かせます。これがゴルーチン(goroutine)です。

たったこれだけ、というのがGoのすごいところで、Go自体が軽量なので何千個と動かせます。

channel

並行で動く処理同士で、安全にデータをやりとりするためのパイプが channel です。

ch <- が送信、<-ch が受信です。複数の処理が勝手にデータを触り合うと事故りますが、channelを通せば「送る・受け取る」が安全に整理されます。「並行で動かしたいときは goroutine、そのデータの受け渡しは channel」——この対応だけ頭に入れておけば、今は十分です。

実務で使うなら

Goには「誰が書いても同じコードになる」という思想があり、それを公式ツールが支えています。最後にこれだけ触れておきます。

go fmt は、コードの見た目(インデントや改行)を公式が決めた形に自動で整えるフォーマッタです。「インデントはタブかスペースか」みたいな不毛なやつがGoには存在しません。全員このツールに従わせるからです。

VSCodeとか多くのエディタは別途、保存時に自動で整えてくれたりもできます。

go test は、テストが標準で組み込まれている仕組みです。main_test.go のように _test.go で終わるファイルにテストを書く、というのが決まりです。テスト用のライブラリを別途入れなくても、最初からテストが書けます。

このあたりに「機能を絞って、迷いどころを公式が先に潰しておいた」なGoの思想がよく出ています。

まとめ

駆け足でしたが、今からGoを動かすうえで「ここだけは」というラインでお話ししていきました。最後に要点だけ振り返ります。

  • Goは機能を削ってシンプルさに全振りした言語。実行が速く、シングルバイナリで配布しやすい。
  • 環境は go mod init で初期化。使ってない変数・importはコンパイルエラーになるので注意。
  • ループは for だけ、後始末は defer で予約。
  • 例外はなく、if err != nil でその場でエラーを確認するのがGo文化。最大の関門だけど慣れる。
  • クラスの代わりに構造体(struct)、機能はメソッド(レシーバ) でひもづける。
  • インタフェースは implements を書かない暗黙実装。メソッドが揃っていれば同じ型として扱える。
  • 並行処理は goroutine と channel。看板機能だけど、入門では存在を知るだけで十分。

全部を完璧に理解してから動かそうとすると、たいてい途中で止まります。それより、まず手元で動かして「あ、こういうことか」を増やしていくほうが、結果的に早いです。

特にGoは、構造体・インタフェース・if err != nil の3つに慣れれば、世の中のGoコードは大体読めるようになります。標準パッケージだけで小さいCLIツール(ファイルを読んで何か出力する、くらいのもの)を1個作って、いじり倒すところから始めてもらえたらと思います。「クラスがない」「例外がない」に最初は戸惑うけど、触っていくうちに「これでいいんだ」と腑に落ちる瞬間が来ます。

よくある質問(FAQ)

Q. プログラミング未経験でも、いきなりGoから始めて大丈夫?

大丈夫ですがあんまりお勧めしません。Goは言語仕様が小さくて覚えることが少ないので、最初の言語としても無理はないです。ただ基礎概念(ifとか)の把握をGoでやるとなると他の言語にない独特な部分もあるし書くことも多いので若干むずいかもです。

Q. クラスがなくて本当に困らないの?

困らないです。構造体(データのまとまり)とインタフェース(メソッドの約束)を組み合わせれば、クラスでやりたかったことはだいたい表現できます。

Q. if err != nil を毎回書くの、冗長じゃない?

正直、最初はくどく感じます。ただ「このコードはどこで失敗しうるか」が全部即書きできるのがメリットで、読むときに安定する感じがします。

Q. goroutineや並行処理は、最初から覚えるべき?

頭パンクするので最初は不要です。存在だけ知っておけば十分で、まずは基礎・構造体・インタフェース・エラー処理に慣れるほうが先です。並行処理が必要な場面になってから踏み込んでも、全然OKです。

Q. 学習には何を使えばいい?

まずは公式の「A Tour of Go」がおすすめです。ブラウザ上でコードを動かしながら基礎を一通りなぞれます。そのあとはなにか自分で作ってみるのが一番伸びます。

自己紹介

現在、8年目になるエンジニア兼PMやってるやむぅ。です!普段はフリーランスエンジニアとして、8人の開発チームのPM(プロジェクトマネージャー)をしたり、AIゲームコーチングサービス『Repl-AI』などの「個人サービス運営」「個人的なエンジニアサポート」この三つを主軸に活動しています。

  • エンジニア歴: 8年目(上流の設計から下流の実装・テストまで全部やってます)
  • 得意な技術: Java, TypeScript, Next.js, Python, Go, Cursor, Claude code など
  • 個人運営スクール: 個人開発や転職にコミットするプログラミングスクール「Programing Factory - ProFact」運営
  • 個人開発したサービス運営: WebニュースのAI分析サービス/Twitchクリップの検索・シェアサイト/Meta社のThreads分析・投稿予約ツール/ゲームプレイのAIコーチングサービス

僕がやっているProFactでは、今回のGoやNext.jsといった「需要の高いプログラミングスキル」と「現役経験から話せる実際のエンジニア業務のリアル」と「AIと一緒に開発する前提の実務スキル」を現役エンジニアと一緒に手を動かしながら学べます。気になった方はのぞいてみてください。

※副業、Web制作を目指している方はお力になれません…ご了承ください。

参考(一次ソース):

  • Go 公式サイト
  • A Tour of Go(公式チュートリアル)
Explore More
関連記事はありません。