Go とは プログラミング初心者にもわかる基礎知識と活用例

はじめに

皆さんは、プログラミング言語にはさまざまな種類があることをご存じでしょうか。 C言語やPython、Javaといった名前を耳にすることが多いかもしれませんが、Go言語 もその中の一つです。 まだ歴史は浅めですが、シンプルな文法と並行処理の扱いやすさなどが評価され、国内外で利用が進んでいます。 これからプログラミングを始めたい方にとっても、学習コストが比較的低めといわれる点が魅力ではないでしょうか。 ここでは、Go言語の特徴や基本的な使い方、実務での利用シーンを具体的にご紹介します。

Go言語とは

Go言語はGoogleによって開発された、コンパイル型のプログラミング言語です。 2009年にオープンソースとして公開され、さまざまな場面で活用されるようになりました。 コンパイラを通じてバイナリファイルを生成する仕組みのため、実行速度が比較的速く、動作も軽快です。 また、コード自体もシンプルな構文を重視しており、初心者が学びやすいと言われることが多いです。

誕生の経緯

Go言語は、サーバーサイドやネットワーク関連の大規模なプロジェクトを効率良く進めるために生まれました。 CやC++を使うほど低レベルな制御をする必要はないけれど、高いパフォーマンスや並行処理が求められる。 そんなニーズに合わせて、Go言語 は堅牢さと扱いやすさを兼ね備えた設計になっています。 開発者たちは、既存の言語の冗長さをできるだけ排除し、必要な機能をコンパクトにまとめたそうです。

キーワードとしてのシンプルさ

Go言語は言語仕様がコンパクトで、キーワードの数も多くありません。 そのため、コードを読んだり書いたりするときに迷いにくく、実務においても可読性を維持しやすいです。 「後から参加した人でもコードを理解しやすい」というメリットが生まれやすいため、現場での導入が進んでいる面があります。

Go言語のメリット

Go言語はほかの言語と比べてどういったところに強みがあるのでしょうか。 ここでは、代表的な特徴を3つほど取り上げます。

シンプルな文法

1つ目は文法のシンプルさです。 多くの機能を詰め込みすぎず、実務でよく使われる構文だけにフォーカスしています。 コードの書き方がある程度決まっているので、全員が似たようなスタイルで開発を進めやすいのがポイントです。

並行処理がしやすい

2つ目は、並行処理(Concurrency)のしやすさが挙げられます。 ゴルーチンと呼ばれる仕組みにより、複数の処理を同時に実行することが簡単です。 ウェブサーバーやマイクロサービスなどを作る際にも、負荷の高い処理を効率的にさばける可能性が高まります。

並行処理とは、単一のプログラム内で複数の処理を同時に進める方法のことです。 サーバーが大量のリクエストを受け付けるときなど、性能を引き出したい場面で特に重要になります。

クロスプラットフォーム対応

3つ目の利点は、さまざまなプラットフォームで動作しやすいことです。 Go言語のコンパイラは、WindowsやmacOS、Linuxなどへ向けたバイナリを生成できるので、開発環境と本番環境が異なるケースでも比較的スムーズに運用できます。

実務での活用シーン

実際の開発現場では、Go言語はどのように使われているのでしょうか。 ここでは3つの代表的な活用例を見てみます。

Webアプリケーション開発

Go言語はWebアプリケーションのサーバーサイドでよく利用されます。 たとえば、ユーザーからのリクエストを受け取り、データベースとやり取りして結果を返すAPIサーバーなどが典型的です。 並行処理が得意な特性を活かして、高いパフォーマンスを期待しやすいと考えられます。

マイクロサービスやクラウド環境

マイクロサービスのように、小さなサービスを多数組み合わせる構成でもGo言語はよく導入されます。 DockerやKubernetesなどのクラウドネイティブ技術とも相性が良く、コンテナ化された環境での運用を想定したツール群もそろっています。 依存関係をまとめて管理しやすいので、大規模なシステムでも見通しを保ちやすいです。

CLIツールやバッチ処理

Go言語は、コマンドラインツールやバッチ処理の開発にも向いています。 コンパイルによる単一バイナリの生成が可能なので、配布や実行が手軽です。 大きなライブラリを抱え込まなくても動くケースが多いため、実務現場でもサッと導入できるメリットがあります。

Go言語の基本的な構文

ここからは、Go言語の具体的な書き方を少しだけ見ていきましょう。 プログラミング未経験の皆さんでも理解しやすいように、なるべくシンプルな例を用意します。

開発環境の準備

Go言語を使うには、公式サイトからインストーラをダウンロードしてインストールするのが一般的です。 macOSの場合はHomebrew、Linuxの場合はパッケージマネージャを利用することもできます。 インストール後にターミナルで下記のようにバージョン確認をして、Go言語の環境が整っているかを確かめます。

go version

Hello, Worldの例

最初の一歩として、コンソールにメッセージを表示するコードを書いてみましょう。

package main

import "fmt"

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

このコードでは、まず package main と宣言して、エントリーポイントである main 関数を用意しています。 fmt.Println は標準出力に文字列を表示するための関数です。 コンパイルと実行は以下のように行います。

go run main.go

「Hello, World」と表示されたら成功です。

変数宣言と制御構文

Go言語では、変数を宣言するときに var:= を使います。 書き方はシンプルで、データ型も暗黙的に推定してくれます。

package main

import "fmt"

func main() {
    var number int = 10
    text := "Go言語を学習中"

    if number > 5 {
        fmt.Println(text)
    }

    for i := 0; i < number; i++ {
        fmt.Println(i)
    }
}

var number int = 10 のように型を明示することもできますし、text := "Go言語を学習中" のように型推定を使うことも可能です。 条件分岐 if や繰り返し for も、ほかの言語と大きく変わらないため、直感的に理解しやすいでしょう。

並行処理のコード例

Go言語の最大の特長の一つであるゴルーチンを使って、並行処理の例を見てみます。 ゴルーチンは、関数呼び出しの先頭に go を付けるだけで手軽に開始できます。

package main

import (
    "fmt"
    "time"
)

func printCount(word string) {
    for i := 1; i <= 5; i++ {
        fmt.Println(word, i)
        time.Sleep(200 * time.Millisecond)
    }
}

func main() {
    go printCount("A")
    go printCount("B")

    // メインゴルーチンが終了しないように待機
    time.Sleep(2 * time.Second)
    fmt.Println("Done")
}

この例では、printCount("A")printCount("B") をゴルーチンとして並行実行しています。 Sleep を入れているのは、メイン処理がすぐに終了しないようにするためです。 実行結果は時間経過とともに「A 1」「B 1」「A 2」「B 2」…などと交互に表示されることがあります。

実務では、終了待ちをする際に time.Sleep だけに頼るのはおすすめできません。 代わりにチャネルや sync.WaitGroup などを使って、ゴルーチンの完了を明示的に待つ方法が一般的です。

エラー処理とパッケージ

Go言語は例外の仕組みがなく、関数の戻り値でエラーを渡す方法が主流です。 この方式は最初は少し面倒に感じるかもしれませんが、エラーの扱いが明示的になるというメリットがあります。

エラー処理の考え方

エラーが発生する可能性のある関数を呼び出すときは、戻り値としてエラーを受け取るのが基本です。 下記のように、処理の結果とエラーを同時に返すパターンが一般的です。

result, err := someFunction()
if err != nil {
    // エラーがあればここで対応
    return
}
// ここで result を利用

このようにエラーが返ってきた段階で対処を行うか、あるいは呼び出し元にそのままエラーを返すかを選択します。

標準ライブラリの活用

Go言語の標準ライブラリには、ファイル操作からネットワーク通信、暗号化まで幅広い機能が揃っています。 パッケージをインポートするだけで利用できるため、開発初期段階から多くの場面に対応できるのは心強いポイントです。 ファイルの読み書きなどは「os」パッケージ、HTTPサーバーの作成には「net/http」パッケージといったように、用途に応じて柔軟に組み合わせられます。

開発フローの一例

実際のプロジェクトでは、Go言語のコードを複数ファイルや複数パッケージに分割して管理することが多いです。 フォルダ構成を工夫することで、機能ごとに整理しやすくなります。

簡単な構成例

下記はWebサーバーを作る場合などに採用されることがある、シンプルなフォルダ構成です。 プロジェクトの要件に合わせて、さらに細かくディレクトリを分ける場合もあるでしょう。

myapp/
 ┣ main.go
 ┣ handler/
 ┃ ┗ user_handler.go
 ┣ model/
 ┃ ┗ user.go
 ┗ router/
   ┗ router.go

main.go がエントリーポイントになり、処理の大枠を記述します。 handler ディレクトリには、ユーザーの登録やログインなどの具体的なロジックを置くことが一般的です。 model はデータ構造を定義する場所として利用します。 router はURLのルーティングやサーバー設定をまとめるイメージです。

コードの配置イメージ

上のような構成の場合、main.go がプロジェクトの中心となり、routerhandler の関数を呼び出していきます。 これによって、変更範囲を限定しやすくなり、チーム開発でも役割分担がスムーズに進む傾向があります。

まとめ

Go言語は、シンプルな文法と強力な並行処理を備えた使いやすいプログラミング言語です。 Webアプリケーションやマイクロサービスの開発など、さまざまな場面で活躍が期待できます。 エラー処理やパッケージ管理も扱いやすく、初心者から実務レベルの開発まで幅広く対応できるでしょう。 もし新しい言語を検討中の皆さんがいれば、Go言語は一度触れてみる価値があるかもしれません。 ぜひ少しずつコードを書きながら、その特徴を体感してみてはいかがでしょうか。

Goをマスターしよう

この記事で学んだGoの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。