1. 基礎を学ぶ
Goの変数、ループ、条件文、関数、データ型などの一般的な概念を学びます。Goの基礎を学ぶための良い出発点は、Goの公式ドキュメントです。
- 公式 Goチュートリアル
- 記事 W3 Schools Goチュートリアル
- フィード Golangに関するトップ投稿を探索
◇基本構文
Goプログラムの実行方法、パッケージのインポート、main関数など、Goの基本構文について学びます。
◇Goの変数
変数は、特定の型の値を格納するためのメモリ位置に付けられた名前です。Goでは、変数を宣言して使用するための複数の方法が提供されています。
- 公式 Goの変数
- 記事 Go by Example: 変数
- 記事 w3schools Goの変数
◇データ型(bool | int, int8/16/32/64 | byte | unit, unit8/16/32/64 | rune | float32/64 | complex64/128 | unitptr)
Goは静的に型付けされたプログラミング言語であり、各変数は最初に型が定義され、その型の値のみを保持できます。Goの型には、基本型と複合型の2つのカテゴリがあります。
◇Forループ
Goには、forループという1つのループ構造しかありません。基本的なforループには、セミコロンで区切られた3つのコンポーネントがあります:
-
init文: 最初の反復の前に実行されます
-
条件式: 各反復の前に評価されます
-
post文: 各反復の最後に実行されます
-
公式 GoのForループ
◇Range
range
は、forループと共に使用して、配列、文字列、およびその他のデータ構造の各要素を反復処理します。
- 公式 GoのRange
- 記事 Go by Example: Range
- 記事 GoのRange基本パターン
◇条件文
条件文は、特定の条件が真の場合にのみコードを実行するために使用されます。Goは以下をサポートしています:
-
if
文 -
if...else
文 -
switch...case
文 -
記事 GoのIf-Else文
◇エラー/パニック/リカバー
例外ハンドラを追加する代わりに、Goの作成者はGoの複数の値を返す能力を活用しました。Goでエラーを発行するために最も一般的に使用される技術は、エラーを戻り値の最後の値として返すことです。
パニックは通常、予期せぬ問題が発生したことを意味します。通常の操作中に発生してはならないエラーや、適切に処理する準備ができていないエラーに対して、迅速に失敗するために使用されます。
Goでのパニック回復は、遅延関数と呼ばれる言語の機能に依存しています。Goは、親関数が戻る時点で関数の実行を保証する能力を持っています。これは、親関数の戻りの理由がreturn文、関数ブロックの終了、またはパニックであるかどうかに関係なく発生します。
◇関数、複数/名前付き戻り値
関数は、特定のタスクを実行するコードのブロックです。プログラムの他の部分から呼び出すことができる再利用可能なコードの単位です。関数はコードを整理し、モジュール化し、可読性を向上させます。
- 公式 Effective Go: 関数
- 記事 Go by Example: 関数
- 記事 Goの関数
◇パッケージ、インポート、エクスポート
パッケージはGo言語の最も強力な部分です。パッケージの目的は、関連する機能を単一の単位にグループ化して、多数のプログラムを設計および維持することです。これにより、保守と理解が容易になり、他のパッケージプログラムから独立して動作します。このモジュール性により、共有と再利用が可能になります。Go言語では、すべてのパッケージは異なる名前で定義され、その名前は「strings」パッケージのように機能に近いものとなっています。このパッケージには、文字列に関連するメソッドと関数のみが含まれています。
- 公式 Goパッケージエクスプローラー
- 公式 標準ライブラリ
- 公式 Goでの外部依存関係の管理方法
- 記事 Goでパッケージを作成する方法
◇型キャスト
Goは自動的な型変換をサポートしていませんが、型キャストを許可しています。型キャストは、変数の型を明示的に変更するプロセスです。
◇型推論
型推論により、Goは値の型を明示的に指定しなくても検出する能力を持っています。これにより、最初に型を指定せずに変数を宣言することが可能になります。
- 公式 Goツアー: 型推論
- 記事 Goの変数: 型推論
◇配列
Goでは、配列
は同じ型の要素のコレクションであり、配列が作成されるときに固定サイズが定義されます。
- 公式 Goの配列
- 公式 Effective Go: 配列
- 動画 Goプログラミングを学ぶ - 配列
◇スライス
スライスは配列に似ていますが、より強力で柔軟です。配列と同様に、スライスも同じ型の複数の値を単一の変数に格納するために使用されます。ただし、配列とは異なり、スライスの長さは必要に応じて増減できます。
- 公式 Goのスライス
- 公式 Effective Go: スライス
- 記事 Goのスライス
- 動画 Goプログラミングを学ぶ - スライス
◇マップ
マップはGoのデータ構造で、キーと値のペア間のマッピングが必要な場合に使用します。マップは要素の追加や削除に関して柔軟性があります。マップは重複エントリを許可せず、データは順序付けられていません。
◇make()
Goの組み込み関数make
は、スライス、マップ、チャネルを作成および初期化するのに役立ちます。この関数に提供される引数に応じて、作成されるデータ構造が異なります。
◇構造体
構造体は、ユーザー定義型であり、単一のエンティティを記述するデータのコレクションを作成するのに役立ちます。
- 公式 Goの構造体
- 記事 Go by Example: 構造体
- 動画 Goの構造体
- 動画 構造体タグとリフレクションによる独自タグの作成
2. さらに深く
Golangの深い理解には、言語のより高度な機能とベストプラクティスを探求し、その全ポテンシャルを引き出すことが含まれます。基本をマスターしたら、Goの複雑な側面を理解することで、コードのパフォーマンス、可読性、保守性を大幅に向上させることができます。
◇Goモジュール
Goモジュールは、バージョン管理され、一緒に配布される関連パッケージのグループです。これらはプロジェクトの要件を指定し、必要な依存関係をリストアップし、インストールされた依存関係の特定のバージョンを追跡するのに役立ちます。
- 公式 Go Modules
- 記事 DigitalOcean: How to use Go Modules
- 動画 Go Modules
- フィード Explore top posts about Golang
◇JSONのマーシャリングとアンマーシャリング
JSON(JavaScript Object Notation)は、シンプルなデータ交換フォーマットです。構文的にはJavaScriptのオブジェクトやリストに似ています。主にウェブバックエンドとブラウザで実行されるJavaScriptプログラム間の通信に使用されますが、他の多くの場所でも使用されます。
◇型、型アサーション、スイッチ
Golangの型は、有効なGo変数が保持できるデータ型を指定します。Golangには、基本型、集約型、参照型、インターフェース型の4つのカテゴリがあります。Golangの型アサーションは、インターフェースの変数の正確な型にアクセスするための手段を提供します。
◇インターフェース
Goのインターフェースは、メソッドのセットを定義する型です。そのメソッドセットを実装する型(例えば構造体)がある場合、その型はこのインターフェースを実装しています。
- 公式 Go Interfaces
- 公式 Effective Go: Interfaces
- 記事 Go by Example: Interfaces
- 動画 Golang Tutorial #22 - Interfaces (by Tech With Tim on YouTube)
- 動画 Understanding Go Interfaces
◇コンテキスト
context
パッケージは、リクエスト中の状態管理の問題を解決するための標準的な方法を提供します。このパッケージは、リクエストスコープのデータの必要性を満たし、デッドライン、キャンセルシグナルなどを処理するための標準化された方法を提供します。
- 公式 Go Context
- 記事 Go by Example: Context
- 記事 Digital Ocean: How to Use Contexts in Go
- 動画 Context in Go
- 動画 Understanding Contexts in Go
◇ゴルーチン
ゴルーチンを使用すると、Goで並行プログラムを書くことができます。ウェブサーバーが数千のリクエストを処理したり、ウェブサイトが新しいページをレンダリングしながら同時にネットワークリクエストを行うなどが並行性の例です。Goでは、これらの並行タスクのそれぞれをゴルーチン
と呼びます。
- 公式 Goroutines
- 公式 Effective Go: Goroutines
- 記事 Go by Example: Goroutines
- 動画 GoRoutines
- 動画 Understanding Concurrency
- フィード Explore top posts about Golang
◇チャネル
チャネルは、並行ゴルーチンを接続するパイプです。あるゴルーチンからチャネルに値を送信し、別のゴルーチンでそれらの値を受信することができます。
チャネルは、チャネル演算子<-
を使用して値を送受信できる型付きの導管です。
- 公式 Channels
- 公式 Effective Go: Channels
- 記事 Go by Example: Channels
- 記事 Channels in Golang
- 動画 Channels
- 動画 Golang Channel Basics You must Know!
◇バッファ
バッファ
はGo言語のバイトパッケージに属し、これらのパッケージを使用して文字列のバイトを操作することができます。
- 公式 Buffer Examples
- 記事 Buffer
◇セレクト
select
ステートメントは、ゴルーチンが複数の通信操作を待機することを可能にします。
select
は、そのケースの1つが実行可能になるまでブロックし、その後そのケースを実行します。複数のケースが準備できている場合、ランダムに1つを選択します。select
ステートメントはswitchステートメントに似ていますが、selectステートメントでは、ケースステートメントは通信、つまりチャネルへの送信または受信操作を指します。
- 公式 Select
- 記事 Go by Example: Select
- 動画 Select Statement
◇ミューテックス
Goでは、ゴルーチンを使用してコードを並行して実行することができます。ただし、並行プロセスが同じデータにアクセスすると、競合状態が発生する可能性があります。ミューテックスは、syncパッケージによって提供されるデータ構造です。これを使用して、データの異なるセクションにロックをかけ、一度に1つのゴルーチンだけがアクセスできるようにすることができます。
◇スケジューラ
Goスケジューラを使用すると、Golangが内部的にどのように動作するかをより深く理解することができます。論理プロセッサ、コア、スレッド、プールキャッシュ、コンテキストスイッチなどについてです。GoスケジューラはGoランタイムの一部であり、Goランタイムはアプリケーションに組み込まれています。
- 記事 OS Scheduler - 1
- 記事 Go Scheduler - 2
- 記事 Illustrated Tales of Go Runtime Scheduler
- 動画 Go scheduler: Implementing language with lightweight concurrency
◇ジェネリクス
Goジェネリクスは、任意の型で動作する関数、データ構造、アルゴリズムを書くことができる機能です。これは、より柔軟で再利用可能なコードを書くのに役立つ強力な機能です。
◇ポインタ
Goのポインタは、メモリアドレスを直接操作できる強力な機能です。これらは変数のメモリアドレスを格納するために使用されます。これは、大量のデータを関数に渡す必要がある場合や、関数内で変数の値を変更する必要がある場合に役立ちます。
3. CLIアプリケーションの構築
グラフィカルユーザーインターフェース(GUI)とは異なり、コマンドラインインターフェース(CLI)はテキストのみです。クラウドやインフラストラクチャアプリケーションは、主にCLIベースです。これは、自動化やリモート操作が容易であるためです。
Goアプリケーションは単一の自己完結型バイナリにビルドされるため、Goアプリケーションのインストールは簡単です。具体的には、Goで書かれたプログラムは、既存のライブラリ、ランタイム、または依存関係を必要とせずに、どのシステムでも実行できます。また、Goで書かれたプログラムは、CやC++と同様に即座に起動しますが、他のプログラミング言語ではこれは実現できません。
◇Cobra
Cobraは、強力なモダンなCLIアプリケーションを作成するためのライブラリです。
- 公式 Cobraウェブサイト
- オープンソース Cobra Github
- 記事 Cobraパッケージドキュメント
- 動画 美しいGolang CLIの書き方
◇Urfave CLI
Urfave CLIは、Goでコマンドラインアプリを構築するためのシンプルで高速で楽しいパッケージです。
- オープンソース Urfave CLI
- 記事 Urfaveウェブサイト
- 記事 GoでCLIを構築する方法
- 記事 urfave cliを使用してCLIを構築する
- フィード CLIに関するトップ投稿を探索
4. ORM
オブジェクト関係マッピング(ORM、O/RM、O/Rマッピングツール)は、コンピュータサイエンスにおいて、オブジェクト指向プログラミング言語を使用して型システム間でデータを変換するためのプログラミング技術です。これにより、事実上「仮想オブジェクトデータベース」が作成され、プログラミング言語内から使用できる抽象化レイヤーが提供されます。Goで最も一般的なORMライブラリはGORMです。
◇GORM
GORMは、Golangのための素晴らしいORMライブラリで、開発者フレンドリーを目指しています。これは、リレーショナルデータベースを扱うためのORMライブラリです。このgormライブラリは、database/sqlパッケージの上に開発されています。ORMの概要と機能は次のとおりです:フル機能のORM(ほぼ)
- 公式 Gorm
- 記事 Gormパッケージ
- 動画 GORMとMYSQL
5. Webフレームワーク
Goにはいくつかの有名なWebフレームワークがあります。最も一般的なものは次のとおりです:
-
Beego
-
Gin
-
Revel
-
Echo
-
GoFiber
-
オープンソース Webフレームワークの比較
-
フィード Golangに関するトップ投稿を探索
◇Beego
Beegoは、Goでのエンタープライズアプリケーションの迅速な開発に使用されます。RESTful API、Webアプリ、バックエンドサービスを含みます。Tornado、Sinatra、Flaskにインスパイアされています。beegoには、インターフェースや構造体の埋め込みなどのGo特有の機能があります。
- オープンソース Beego/Beego
◇Gin
Ginは、Golang(Go)で書かれた高性能HTTP Webフレームワークです。GinはMartiniのようなAPIを持ち、最大40倍高速であると主張しています。Ginを使用すると、GoでWebアプリケーションやマイクロサービスを構築できます。
- オープンソース Gin
- 記事 Gin Webフレームワーク
- フィード Golangに関するトップ投稿を探索
◇Revel
Revelは、エンドポイントをコントローラーに整理します。簡単なデータバインディングとフォーム検証を提供します。Revelは、Goテンプレートを大規模に簡単に使用できるようにします。アクションの前後に呼び出される機能を登録します。
- 公式 Revel
- 記事 Revelパッケージ
◇Echo
Echoは、パフォーマンスに焦点を当てた拡張可能なオープンソースのGo Webアプリケーションフレームワークです。これは、stdlib +ルーターとフルスタックWebフレームワークの間に位置するミニマリストWebフレームワークです。
- 公式 Echoウェブサイト
- オープンソース Echo
◇Gofiber
Go Fiberは、ExpressにインスパイアされたGolangのフレームワークです。Go Fiberは、高速HTTPの上に構築されたWebフレームワークです。ルーティング/エンドポイント、ミドルウェア、サーバーリクエストなどの操作を処理するために使用できます。
◇Gorilla
Gorillaは、Goプログラミング言語のためのWebツールキットで、HTTPベースのアプリケーションを書くための有用で構成可能なパッケージを提供します。
- 公式 Gorillaツールキット
- オープンソース Gorilla
6. ロギング
Goには、プログラマーがロギングを簡単に実装できるようにするための組み込み機能があります。また、サードパーティがロギングをさらに簡単にするための追加ツールを提供しています。
◇log/slog
log
およびlog/slog
(Go 1.21以降)パッケージは、Goの標準ロギングパッケージです。これらのパッケージは、コンソールやファイルにメッセージをログ出力するためのシンプルなAPIを提供します。
- 公式 ドキュメント: log
- 公式 ドキュメント: slog
- 公式 Goブログ: slogを使った構造化ロギング
- 記事 Go by Example: ロギング
- フィード ロギングに関するトップ投稿を探索
◇Zap
Goでの高速で構造化されたレベル別ロギング。
- オープンソース Zap
◇Zerolog
Zerologパッケージは、JSON出力に特化した高速でシンプルなロガーを提供します。
ZerologのAPIは、優れた開発者体験と驚異的なパフォーマンスを提供するように設計されています。そのユニークなチェーンAPIにより、Zerologはアロケーションとリフレクションを避けてJSON(またはCBOR)ログイベントを書き込むことができます。
- オープンソース Zerolog
7. リアルタイム通信
名前の通り、リアルタイム通信はリクエストを並行して効率的に処理することです。チャット/メッセージングアプリ、メールサービス、ゲームサーバー、またはオンライン共同プロジェクト(例: Excalidraw)など、リアルタイム通信を処理する方法はいくつかありますが、最も一般的なのはWebSocketを使用する方法です。その他のリアルタイム通信のオプションには、MQTTプロトコルやサーバー送信イベントなどがあります。
◇Melody
Melodyは、gorilla/websocketに基づくWebSocketフレームワークで、WebSocketの扱いにおける面倒な部分を抽象化します。リアルタイムアプリを簡単に作成できるようにします。
◇Centrifugo
Centrifugoは、オープンソースのスケーラブルなリアルタイムメッセージングサーバーです。Centrifugoは、サポートされているトランスポート(WebSocket、HTTP-streaming、SSE/EventSource、GRPC、SockJS、WebTransport)を介して接続されたアプリケーションのオンラインユーザーにメッセージを即座に配信できます。Centrifugoにはチャネルの概念があり、ユーザー向けのPUB/SUBサーバーです。
- 公式 はじめに
- オープンソース Centrifugo
8. APIクライアント
APIクライアントは、コンピュータ上のアプリケーションから動作するツールとプロトコルのセットです。これらは、ウェブアプリケーションの開発時に毎回車輪の再発明をするのではなく、いくつかの操作をバイパスするのに役立ちます。クライアントAPIを使用することは、開発プロセスをスピードアップするための優れた方法です。
- 記事 APIクライアント
- フィード Golangに関するトップ投稿を探索
◇REST
REST(Representational State Transfer)API(Application Programming Interface)は、ウェブサイトを扱う際にユーザー機能を提供するために使用されます。HTTPリクエストを使用してREST APIと通信し、ユーザーがURLウェブサイトをナビゲートできるようにします。これらのURLは、APIの一部として保存されている特定の情報を返すことができます。
- 公式 チュートリアル
- 動画 RESTful APIシリーズ
- フィード REST APIに関するトップ投稿を探索
Heimdall
Heimdallは、アプリケーションが大規模な数のリクエストを行うのを支援するHTTPクライアントです。Heimdallを使用すると、以下のことができます:
-
失敗するリクエストを制御するためのHystrixのようなサーキットブレーカーを使用する
-
各リクエストに同期メモリ内リトライを追加し、独自のリトライ戦略を設定するオプションを提供する
-
すべてのリクエストに対して異なるタイムアウトを持つクライアントを作成する すべてのHTTPメソッドは、フルーエントインターフェースとして公開されています。
-
オープンソース Heimdall
Grequests
Pythonの有名なHTTPライブラリであるGrequestsライブラリのGolang実装です。
特徴:
-
レスポンスをJSONおよびXMLにシリアライズ可能
-
簡単なファイルアップロード
-
簡単なファイルダウンロード
-
以下のHTTP動詞をサポート: GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS
-
オープンソース Grequests
◇GraphQL
GraphQL
はAPIのためのクエリ言語で、クライアントが要求したデータだけを提供するサービスを優先します。また、REST APIのような破壊的変更、バージョニング、後方互換性について心配する必要はありません。そのため、GraphQL
を使用するだけで、独自のバージョンを実装し、APIを自動ドキュメント化できます。
- ロードマップ 専用のGraphQLロードマップを参照
- 公式 GraphQLを学ぶ
- 公式 GraphQLチュートリアル
- 記事 Red Hat: GraphQLとは?
- 記事 Digital Ocean: GraphQL入門
- 動画 GraphQL完全コース - 初心者からエキスパートまで
- 動画 初心者向けGraphQLシリーズ(Ben AwadによるYouTube)
- フィード GraphQLに関するトップ投稿を探索
Graphql-go
Go
のためのGraphQL
パッケージ。
- オープンソース Graphql
- 記事 Graphql-goホームページ
- 記事 Graphql-goドキュメント
- 動画 GraphQL-Go - Golangチュートリアル(TechPracticeによるYouTube)
- フィード GraphQLに関するトップ投稿を探索
Gqlgen
ドキュメントによると、GolangでGraphQLサーバーを簡単に構築するためのライブラリです。
- 公式 Gqlgenドキュメント
- 記事 gqlgenの紹介: GoのためのGraphQLサーバージェネレータ
- 動画 GoでのGraphQL - GQLGenチュートリアル(acklacklによるYouTube)
9. Goコードのテスト
Goには、プログラムをテストするために使用できる組み込みのテストコマンドがあります。
- 公式 Goチュートリアル: テストの追加
- 記事 Go by Example: テスト
- 記事 YourBasic Go: テーブル駆動ユニットテスト
- 記事 Learn Go with Tests
- フィード テストに関するトップ投稿を探索
10. マイクロサービス向けツール
マイクロサービスは、ソフトウェア開発のアーキテクチャアプローチであり、明確に定義されたAPIを介して通信を行うデプロイ可能なサービスから分散アプリケーションを作成することを可能にします。モノリシックなアプリケーションに対する解決策です。
- 公式 Chris Richardsonによるマイクロサービスパターンとリソース
- 記事 マイクロサービスの紹介
- 記事 マイクロサービスのアンチパターンと落とし穴 - Mark Richards
- 記事 Building Microservices, 第2版 - Sam Newman
- フィード マイクロサービスに関するトップ投稿を探索
◇Watermill
Watermillは、Goで非同期リクエストを処理するためのイベントストリーミングライブラリです。Pub/Subのための複数の実装を提供しています。例えば、KafkaやRabbitMQのような従来のPub/Subシステムや、HTTPやMySQLのバイナリログなど、ユースケースに応じて使用できます。
◇Rpcx
Rpcxは、Alibaba DubboやWeibo MotanのようなRPC(リモートプロシージャコール)フレームワークです。Rpcxを使用する利点は以下の通りです:
-
シンプル:学びやすく、開発しやすく、統合しやすく、デプロイしやすい
-
パフォーマンス:高性能(>= grpc-go)
-
クロスプラットフォーム:生のバイトスライス、JSON、Protobuf、MessagePackをサポート。理論的にはJava、PHP、Python、C/C++、Node.js、C#などのプラットフォームで使用可能
-
サービスディスカバリーとサービスガバナンス:Zookeeper、etcd、Consulをサポート
-
公式 Rpcx公式ウェブサイト
-
公式 Rpcxドキュメント
-
オープンソース Rpcx
◇Go-kit
Go kitは、Goでマイクロサービス(またはエレガントなモノリス)を構築するためのプログラミングツールキットです。分散システムやアプリケーションアーキテクチャにおける一般的な問題を解決し、ビジネス価値を提供することに集中できるようにします。
◇Micro
これはAPIファーストの開発プラットフォームです。マイクロサービスアーキテクチャパターンを活用し、プラットフォームのビルディングブロックとして機能する一連のサービスを提供します。
- 公式 Microウェブサイト
- オープンソース Micro
◇go-zero
go-zeroは、多くのエンジニアリングベストプラクティスが組み込まれたWebおよびRPCフレームワークです。レジリエンス設計により、繁忙なサービスの安定性を確保するために生まれ、何百万人ものユーザーを抱えるサイトに長年サービスを提供しています。
- 公式 Go-zero
- 公式 Go-zeroドキュメント
- オープンソース Go-Zero
- フィード Golangに関するトップ投稿を探索
◇Protocol Buffers
Protocol Buffers(Protobuf)は、構造化データをシリアライズするために使用される、無料でオープンソースの言語中立、プラットフォーム中立、拡張可能なデータフォーマットです。JSONに似ていますが、より小さく、高速で、ネイティブの言語バインディングを生成します。
Protocol Buffersを使用する利点は以下の通りです:
-
コンパクトなデータストレージ
-
高速なパース
-
多くのプログラミング言語での利用可能
-
自動生成クラスによる最適化された機能
-
オープンソース Protobuf
-
記事 GoでのProtobuf
-
フィード バックエンド開発に関するトップ投稿を探索
◇gRPC-Go
gRPCのGo言語実装(gRPCはRPC APIを実装するための技術です)。
- 公式 GoでのgRPCの基本的なチュートリアル
- オープンソース gRPC-go
- 記事 gRPC-goドキュメント
- フィード gRPCに関するトップ投稿を探索
◇Grpc gateway
gRPC-Gatewayは、gRPCサービスの上にレイヤーを作成し、クライアントに対してRESTfulサービスとして機能します。protocのプラグインです。gRPCサービスの定義を読み取り、RESTful JSON APIをgRPCに変換するリバースプロキシサーバーを生成します。
- 公式 Grpc-gatewayドキュメント
- オープンソース Grpc-gateway
- フィード gRPCに関するトップ投稿を探索
◇Twirp
Twirpは、シンプルさとミニマリズムを重視したサービス間通信のためのフレームワークです。API定義ファイルからルーティングとシリアライゼーションを生成し、HTTPメソッドやパス、JSONなどの雑事に悩むことなく、アプリケーションのロジックに集中できるようにします。