Skip to content

Go 入門ガイド

この記事では、Go 言語の入門方法を説明します。構文レベルだけで言えば、それほど難しくなく、数日で習得できるでしょう。ただし、慣例として、本格的に始める前に、その背景と起源について理解しておく必要があります。

背景

Go 言語は 3 人の大物によって共同で創造されました。彼らはそれぞれ

  • Ken Thompson、チューリング賞受賞者、Unix システム創始者、B 言語創始者、C 言語創始者
  • Rob Pike、Plan9 オペレーティングシステムの著者の一人、UTF-8 発明者の一人、Go 言語設計のリーダー
  • Robert Griesemer、JS V8 エンジン開発者、3 人の中で最年少

もう一人、Rob Pike の妻である Renee French が Go 言語のロゴをデザインしました。それは青いプレーリードッグです。

ある日、3 人のエンジニアが C++ プロジェクトの長いコンパイル待ちで退屈している間、Rob Pike の頭に突然斬新な構想が閃きました。シンプルで小さく、コンパイルが高速で、同時に優れたパフォーマンスを持つプログラミング言語を設計したいと考えました。そうすれば、毎回コンパイル時に長い待ち時間を過ごす必要がなくなるからです。短いブレインストーミングの後、3 人は 2007 年 9 月 20 日に短い会議を開き、この言語の初期プロトタイプの議論と設計を開始しました。まさにこの瞬間から、Go 言語が正式に誕生しました。その後、这个小チームはますます多くの志を同じくする開発者を引き付け、最終的に 2009 年 11 月 10 日、グーグル社は Go 言語を BSD-3-Clause ライセンスで正式にオープンソース化し、最初の先行バージョンをリリースし、正式な開発チームを結成しました。

ヒント

他の場所で Golang と呼ばれているのを見かけるかもしれませんが、当サイトの Github リポジトリ名も Golang-Doc ですが、公式名は常に Go です。初期の頃は go というドメイン名が既に登録されていたため、公式サイトは golang.org を採用しました。そのため、後から来た人々が誤って Golang という名前だと思い込んでしまいました。

これは公式サイトのかつての姿です

その後、Go チームは 3 年間の設計と開発を経て、2012 年 3 月に最初の正式バージョン Go1.0 をリリースしました(この時点では Go のツールチェーンとランタイムはまだ C 言語で書かれており、Go1.5 になってようやく自己完結しました)。その後、毎年 2 つのマイナーバージョンを更新し、現在まで運営・維持を続けています。

3 人の創設者は実際には非常に早くに引退しており、大部分の時間において、チームのリーダーは Russ Cox でした。彼は Go 言語が外部に公開される前から開発作業に参加しており、その後 12 年間にわたって Go チームを管理し続け、2024 年 8 月に退任し、Austin Clements が後任として開発作業をリードしています。

Go 言語の歴史について詳しく知りたい場合は、Go History で詳細をご覧ください。

特性

  • 構文がシンプル Go 言語は自由度と柔軟性の間でバランスを取り、それによってより良い保守性と滑らかな学習曲線を実現しています。
  • デプロイに優しい Go の静的コンパイル後のバイナリファイルは追加の実行環境に依存せず、コンパイル速度も非常に高速です。
  • クロスコンパイル Go はコンパイル時に 2 つのパラメータを簡単に設定するだけで、他のプラットフォームで実行可能なプログラムをコンパイルできます。
  • ネイティブ並行処理 Go 言語の並行処理へのサポートはネイティブで、キーワード 1 つで非同期コルーチンを開始できます。
  • ガベージコレクション Go は優れた GC パフォーマンスを持ち、大部分の状況で GC 遅延は 1 ミリ秒を超えません。
  • 豊富な標準ライブラリ 文字列処理からソースコード AST 解析まで、機能豊富で強力な標準ライブラリが Go 言語の堅固な基盤です。
  • 完善されたツールチェーン Go には完善された開発ツールチェーンがあり、コンパイル、テスト、依存関係管理、パフォーマンス分析など多岐にわたります。

Go 言語は継承を放棄し、OOP を弱体化し、クラス、メタプログラミング、ジェネリクス、ラムダ式などの特性を捨て、良好なパフォーマンスと低い学習難易度を持っています。クラウドサービス開発、アプリケーションサーバーサイド開発、およびネットワークプログラミングに適しています。GC を内蔵しており、開発者が手動でメモリを管理する必要がありません。静的コンパイルとクロスコンパイルの 2 点は運用担当者にも非常に友好的です。

Go 言語の欠点も同様に多くあります。例えば、問題の多いエラー処理、不完全なジェネリクス、標準ライブラリは豊富ですが内蔵データ構造がいくつかしかない、interface{} 型が飛び交っている、列挙型がないなどです。これらに加えて、Go 開発チームは非常に独断的で、コミュニティの意見に耳を傾けるのが得意ではありません。(これと比較して、Rust はエラー処理、ジェネリクス、依存関係管理、列挙型、インターフェースなどの面でより優れています)

総じて、私たちは一門の言語を弁証法的に捉える必要があります。エンジニアリング言語として、Go はチームの下限を大幅に向上させることができ、開発者のレベルがどれだけ低くてもカバーでき、ほとんど「一匹のネズミが一鍋をダメにする」ような状況は発生しません。同時に、シンプルな構文と低い学習難易度により、プロジェクトにすぐに着手できます。Go が世に出て 10 余年しか経っていませんが、すでに相当数の企業が Go を首选言語として採用しており、Go が徐々に流行していることを側面から示しています。

ちなみに、Go は完全にオープンソースの言語で、コミュニティとグーグルが共同で Go 言語の発展を維持しています。公式アドレスはグーグルのリポジトリにあり、Github 上にも同じミラーリポジトリがあります。興味があれば言語設計に参加することもできます。

公式サイト:The Go Programming Language

グーグルオープンソースリポジトリ:google/go: Google Open Source

Github リポジトリ:golang/go: The Go programming language

TIP

筆者はかつて Go に PR を提出しました。Go にコードを貢献する方法について知りたい場合は、私が書いたこの記事をご覧ください:如何向 Go 贡献代码

多くの人は Rust について聞いたことがあるでしょう。これは高性能な汎用プログラミング言語で、誕生時期は Go より 1 年早かったです。Go1 の正式リリース時期は 2012 年で、Rust の正式版リリース時期は 2015 年です。これらはどちらも比較的モダンな言語で、発展分野はそれぞれ異なります。Go の実行効率と表現力に満足できない場合は、Rust を試してみてください。ただし、その学習難易度は Go ほどシンプルではありません。

インストール

Go 言語ダウンロード:Downloads - The Go Programming Language

Stable Version は現在メンテナンスされている 2 つの安定バージョンを指し、Archived Version はメンテナンスされていない歴史的バージョンを指します。更新ログ でメンテナンスルールと歴史的バージョンの詳細をご覧ください。

windows

windows プラットフォームの場合、installer と archive の 2 つのタイプから選択できます。前者はインストーラーで、クリックするだけで済みます。後者をお勧めします。go 言語のディレクトリ構造に慣れることができ、将来問題が発生しても慌てずに済みます。zip ファイルをダウンロードして選択し、圧縮ファイルには go 言語のソースコード、ツールチェーン、ドキュメントが含まれています。これを指定されたパスに解凍し、2 つのシステム環境変数を設定する必要があります。

  • GOROOT - go 言語のインストールパス
  • GOPATH - go 言語の依存関係保存パス

設定後、システム環境変数 PATH に 2 つの新しい項目を追加します。

  • %GOROOT%\bin:go バイナリプログラムアドレス
  • %GOPATH%\bin:将来ダウンロードするサードパーティ依存関係のバイナリファイル保存アドレス

powershellgo version コマンドを実行し、最後にバージョンを正常に表示できればインストール成功です。

powershell
PS C:\user\username> go version
go version go1.21.3 windows/amd64

更新する場合は、新しい zip をダウンロードして元のインストールディレクトリを上書きするだけです。

linux

ubuntu を例に、必要なバージョンのリンクをコピーしてローカルにダウンロードします。

sh
$ wget https://golang.google.cn/dl/go1.21.1.linux-amd64.tar.gz

指定ディレクトリに解凍します。

sh
$ tar -C ~/go -xzf go1.21.1.linux-amd64.tar.gz

$HOME/.bashrc ファイルで環境変数を設定します。

sh
export GOROOT=$HOME/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

完了後、インストールバージョンを確認し、正しくインストールされたことを確認します。

sh
$ go version
go version go1.21.1 linux/amd64

更新する場合は、新しい tar.gz をダウンロードして元のインストールディレクトリを上書きするだけです。

インストール管理

上記のインストール方法は基本的な使用には十分です。個人としては、以下のディレクトリ構造で go 言語とその派生ファイルを保存することをお勧めします。

go/
|
|--root/
|  |
|  |--go1.21.3/
|  |
|  |--go1.20.10/
|
|--mod/
|  |
|  |--bin/
|  |
|  |--libs/
|
|--cache/
|
|--temp/
|
|--env

説明は以下の通りです。

  • go/root ディレクトリは各バージョンの go 言語ソースファイルを保存するために使用されます。
  • go/modGOAPTH に対応します。
  • go/mod/libsGOMODCACHE に対応し、ダウンロードしたサードパーティ依存関係の保存アドレスです。
  • go/mod/binGOBIN に対応し、サードパーティ依存関係のバイナリファイルの保存アドレスです。
  • go/cacheGOCACHE に対応し、キャッシュファイルを保存します。
  • go/tempGOTMPDIR に対応し、一時ファイルを保存します。
  • go/envGOENV に対応し、グローバル環境変数設定ファイルです。

この方法では、更新時に元のインストールディレクトリを上書きする必要がなく、go/root ディレクトリに保存し、GOROOT システム環境変数をそのディレクトリ下の指定バージョンのフォルダに変更するだけです。デフォルトでは env ファイルはパス GOROOT/env を読み取り、GOENV システム変数を設定して GOROOT から分離することで、バージョン変更時の go 環境変数設定の変更を回避します。以下は env ファイルの初期設定です。

ini
GO111MODULE=on
GOCACHE=go/cache
GOMODCACHE=go/mod/libs
GOBIN=go/mod/bin
GOTMPDIR=go/temp

これは筆者が好きなディレクトリスタイルの一つです。コマンド - 環境変数 で環境変数の詳細をご覧ください。完全に個人の好みに合わせてカスタマイズできます。

複数バージョン管理

私は複数バージョン管理ツール govm を作成しました。上記のディレクトリ構造と組み合わせて使用すると最も効果的です。これはローカルの複数の Go バージョンを管理でき、いつでもバージョンを切り替えられ、他の Go バージョンを検索してダウンロードしてローカルにインストールすることもできます。

bash
$ govm search 1.22 -n 10
go1.22.6           76 MB
go1.22.5           76 MB
go1.22.4           76 MB
go1.22.3           76 MB
go1.22.2           76 MB
go1.22.1           76 MB
go1.22.0           76 MB

$ govm install 1.22.4
Fetch go1.22.4 from https://dl.google.com/go/go1.22.4.windows-amd64.zip
Downloading go1.22.4.windows-amd64.zip 100% |████████████████████████████████████████| (76/76 MB, 32 MB/s) [2s]
Extract go1.22.4.windows-amd64.zip to local store
Remove archive from cache
Version go1.22.4 installed

$ govm use 1.22.4
Use go1.22.4 now

# シェルを再ログイン
$ go version
go version go1.22.4 windows/amd64

Go でコマンドラインツールを作成する方法について知りたい場合は、govm をプロジェクト参考として使用しても構いません。これも Go で書かれています。

エディタ

主流の go 言語 IDE は現在個人としては以下の 2 つのみをお勧めします。

  1. goland:jetbrain 製、機能豊富、全方位サポート、ただし有料、IDEA コミュニティエディションとプラグインの組み合わせを検討可能
  2. vscode:無料、万能エディタ、プラグインでどんな言語でも書ける

他のエディタで自身の使用習慣に合うものがあれば、それを使用しても構いません。エディタは何でも構いません。短い練習コードを書くだけであれば、公式が提供する goplay を試してみてください。go コードをオンラインで実行できます。

TIP

JetBrains Toolbox を使用している場合は、私が書いたコマンドラインツール AutoToolBox を試してみてください。Toolbox に windows 右クリックメニューを生成できます。効果図は以下の通りです。

激励

Go 言語の全体的な難易度は高くありません。他の言語の基礎がある場合は非常に簡単に学べます。学習中に理解できない難しい点に遭遇したら、まずスキップしてください。どんな言語を学ぶのも、まずその言語の概略的な構文と構造を包括的に理解し、その後で特性や詳細を深く追求するものです。ドキュメントの理念も同様で、入門学習に適しています。筆者自身も単なる普通の学生に過ぎず、見落としや誤りがあるかもしれません。もし誤りを見つけた場合は Github で PR を提出してください。ドキュメントが気に入った場合は Github で Star を付けてください。

あなたが強力な OOP 言語の開発者、例えば Java、C# などの場合、OOP の思想を持って先入観を持たないでください。否则会对 go 的很多设计感到匪夷所思、コードを書く際も非常に苦しくなります。筆者も最初はそうでした。

概観

以下では、当サイトの内容を簡単に紹介します。これにより、必要に応じて読むことができます。一部のページが空白の場合は、まだ更新されていないことを示しています。

  • 言語入門:主に Go 言語自体に関する内容を説明します。理論寄りです。
    • 構文基礎:主に iffor などの非常に基本的な構文ルールを説明します。
    • 構文进阶:主に Go 固有の内容、モジュール、テスト、コルーチンなどの関連内容を説明します。
    • 標準ライブラリ:Go 固有の標準ライブラリの簡単な紹介です。標準ライブラリのコンテンツは非常に大きいため、随缘で更新します。
    • 実装原理:主に Go 言語の内部設計原理、例えばコルーチンスケジューリング、メモリ管理、ガベージコレクションなどを説明します。
  • コミュニティエコ:主に Go 周辺のエコを説明します。アプリケーション寄りです。

準備開始 で入門学習を開始してください。

Golang学习网由www.golangdev.cn整理维护