1. 基礎を学ぶ

Goの変数、ループ、条件文、関数、データ型などの一般的な概念を学びます。Goの基礎を学ぶための良い出発点は、Goの公式ドキュメントです。

◇基本構文

Goプログラムの実行方法、パッケージのインポート、main関数など、Goの基本構文について学びます。

◇Goの変数

変数は、特定の型の値を格納するためのメモリ位置に付けられた名前です。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つのコンポーネントがあります:

◇Range

rangeは、forループと共に使用して、配列、文字列、およびその他のデータ構造の各要素を反復処理します。

◇条件文

条件文は、特定の条件が真の場合にのみコードを実行するために使用されます。Goは以下をサポートしています:

◇エラー/パニック/リカバー

例外ハンドラを追加する代わりに、Goの作成者はGoの複数の値を返す能力を活用しました。Goでエラーを発行するために最も一般的に使用される技術は、エラーを戻り値の最後の値として返すことです。

パニックは通常、予期せぬ問題が発生したことを意味します。通常の操作中に発生してはならないエラーや、適切に処理する準備ができていないエラーに対して、迅速に失敗するために使用されます。

Goでのパニック回復は、遅延関数と呼ばれる言語の機能に依存しています。Goは、親関数が戻る時点で関数の実行を保証する能力を持っています。これは、親関数の戻りの理由がreturn文、関数ブロックの終了、またはパニックであるかどうかに関係なく発生します。

◇関数、複数/名前付き戻り値

関数は、特定のタスクを実行するコードのブロックです。プログラムの他の部分から呼び出すことができる再利用可能なコードの単位です。関数はコードを整理し、モジュール化し、可読性を向上させます。

◇パッケージ、インポート、エクスポート

パッケージはGo言語の最も強力な部分です。パッケージの目的は、関連する機能を単一の単位にグループ化して、多数のプログラムを設計および維持することです。これにより、保守と理解が容易になり、他のパッケージプログラムから独立して動作します。このモジュール性により、共有と再利用が可能になります。Go言語では、すべてのパッケージは異なる名前で定義され、その名前は「strings」パッケージのように機能に近いものとなっています。このパッケージには、文字列に関連するメソッドと関数のみが含まれています。

◇型キャスト

Goは自動的な型変換をサポートしていませんが、型キャストを許可しています。型キャストは、変数の型を明示的に変更するプロセスです。

◇型推論

型推論により、Goは値の型を明示的に指定しなくても検出する能力を持っています。これにより、最初に型を指定せずに変数を宣言することが可能になります。

◇配列

Goでは、配列は同じ型の要素のコレクションであり、配列が作成されるときに固定サイズが定義されます。

◇スライス

スライスは配列に似ていますが、より強力で柔軟です。配列と同様に、スライスも同じ型の複数の値を単一の変数に格納するために使用されます。ただし、配列とは異なり、スライスの長さは必要に応じて増減できます。

◇マップ

マップはGoのデータ構造で、キーと値のペア間のマッピングが必要な場合に使用します。マップは要素の追加や削除に関して柔軟性があります。マップは重複エントリを許可せず、データは順序付けられていません。

◇make()

Goの組み込み関数makeは、スライス、マップ、チャネルを作成および初期化するのに役立ちます。この関数に提供される引数に応じて、作成されるデータ構造が異なります。

◇構造体

構造体は、ユーザー定義型であり、単一のエンティティを記述するデータのコレクションを作成するのに役立ちます。

2. さらに深く

Golangの深い理解には、言語のより高度な機能とベストプラクティスを探求し、その全ポテンシャルを引き出すことが含まれます。基本をマスターしたら、Goの複雑な側面を理解することで、コードのパフォーマンス、可読性、保守性を大幅に向上させることができます。

◇Goモジュール

Goモジュールは、バージョン管理され、一緒に配布される関連パッケージのグループです。これらはプロジェクトの要件を指定し、必要な依存関係をリストアップし、インストールされた依存関係の特定のバージョンを追跡するのに役立ちます。

◇JSONのマーシャリングとアンマーシャリング

JSON(JavaScript Object Notation)は、シンプルなデータ交換フォーマットです。構文的にはJavaScriptのオブジェクトやリストに似ています。主にウェブバックエンドとブラウザで実行されるJavaScriptプログラム間の通信に使用されますが、他の多くの場所でも使用されます。

◇型、型アサーション、スイッチ

Golangの型は、有効なGo変数が保持できるデータ型を指定します。Golangには、基本型、集約型、参照型、インターフェース型の4つのカテゴリがあります。Golangの型アサーションは、インターフェースの変数の正確な型にアクセスするための手段を提供します。

◇インターフェース

Goのインターフェースは、メソッドのセットを定義する型です。そのメソッドセットを実装する型(例えば構造体)がある場合、その型はこのインターフェースを実装しています。

◇コンテキスト

contextパッケージは、リクエスト中の状態管理の問題を解決するための標準的な方法を提供します。このパッケージは、リクエストスコープのデータの必要性を満たし、デッドライン、キャンセルシグナルなどを処理するための標準化された方法を提供します。

◇ゴルーチン

ゴルーチンを使用すると、Goで並行プログラムを書くことができます。ウェブサーバーが数千のリクエストを処理したり、ウェブサイトが新しいページをレンダリングしながら同時にネットワークリクエストを行うなどが並行性の例です。Goでは、これらの並行タスクのそれぞれをゴルーチンと呼びます。

◇チャネル

チャネルは、並行ゴルーチンを接続するパイプです。あるゴルーチンからチャネルに値を送信し、別のゴルーチンでそれらの値を受信することができます。

チャネルは、チャネル演算子<-を使用して値を送受信できる型付きの導管です。

◇バッファ

バッファはGo言語のバイトパッケージに属し、これらのパッケージを使用して文字列のバイトを操作することができます。

◇セレクト

selectステートメントは、ゴルーチンが複数の通信操作を待機することを可能にします。

selectは、そのケースの1つが実行可能になるまでブロックし、その後そのケースを実行します。複数のケースが準備できている場合、ランダムに1つを選択します。selectステートメントはswitchステートメントに似ていますが、selectステートメントでは、ケースステートメントは通信、つまりチャネルへの送信または受信操作を指します。

◇ミューテックス

Goでは、ゴルーチンを使用してコードを並行して実行することができます。ただし、並行プロセスが同じデータにアクセスすると、競合状態が発生する可能性があります。ミューテックスは、syncパッケージによって提供されるデータ構造です。これを使用して、データの異なるセクションにロックをかけ、一度に1つのゴルーチンだけがアクセスできるようにすることができます。

◇スケジューラ

Goスケジューラを使用すると、Golangが内部的にどのように動作するかをより深く理解することができます。論理プロセッサ、コア、スレッド、プールキャッシュ、コンテキストスイッチなどについてです。GoスケジューラはGoランタイムの一部であり、Goランタイムはアプリケーションに組み込まれています。

◇ジェネリクス

Goジェネリクスは、任意の型で動作する関数、データ構造、アルゴリズムを書くことができる機能です。これは、より柔軟で再利用可能なコードを書くのに役立つ強力な機能です。

◇ポインタ

Goのポインタは、メモリアドレスを直接操作できる強力な機能です。これらは変数のメモリアドレスを格納するために使用されます。これは、大量のデータを関数に渡す必要がある場合や、関数内で変数の値を変更する必要がある場合に役立ちます。

3. CLIアプリケーションの構築

グラフィカルユーザーインターフェース(GUI)とは異なり、コマンドラインインターフェース(CLI)はテキストのみです。クラウドやインフラストラクチャアプリケーションは、主にCLIベースです。これは、自動化やリモート操作が容易であるためです。

Goアプリケーションは単一の自己完結型バイナリにビルドされるため、Goアプリケーションのインストールは簡単です。具体的には、Goで書かれたプログラムは、既存のライブラリ、ランタイム、または依存関係を必要とせずに、どのシステムでも実行できます。また、Goで書かれたプログラムは、CやC++と同様に即座に起動しますが、他のプログラミング言語ではこれは実現できません。

◇Cobra

Cobraは、強力なモダンなCLIアプリケーションを作成するためのライブラリです。

◇Urfave CLI

Urfave CLIは、Goでコマンドラインアプリを構築するためのシンプルで高速で楽しいパッケージです。

4. ORM

オブジェクト関係マッピング(ORM、O/RM、O/Rマッピングツール)は、コンピュータサイエンスにおいて、オブジェクト指向プログラミング言語を使用して型システム間でデータを変換するためのプログラミング技術です。これにより、事実上「仮想オブジェクトデータベース」が作成され、プログラミング言語内から使用できる抽象化レイヤーが提供されます。Goで最も一般的なORMライブラリはGORMです。

◇GORM

GORMは、Golangのための素晴らしいORMライブラリで、開発者フレンドリーを目指しています。これは、リレーショナルデータベースを扱うためのORMライブラリです。このgormライブラリは、database/sqlパッケージの上に開発されています。ORMの概要と機能は次のとおりです:フル機能のORM(ほぼ)

5. Webフレームワーク

Goにはいくつかの有名なWebフレームワークがあります。最も一般的なものは次のとおりです:

◇Beego

Beegoは、Goでのエンタープライズアプリケーションの迅速な開発に使用されます。RESTful API、Webアプリ、バックエンドサービスを含みます。Tornado、Sinatra、Flaskにインスパイアされています。beegoには、インターフェースや構造体の埋め込みなどのGo特有の機能があります。

◇Gin

Ginは、Golang(Go)で書かれた高性能HTTP Webフレームワークです。GinはMartiniのようなAPIを持ち、最大40倍高速であると主張しています。Ginを使用すると、GoでWebアプリケーションやマイクロサービスを構築できます。

◇Revel

Revelは、エンドポイントをコントローラーに整理します。簡単なデータバインディングとフォーム検証を提供します。Revelは、Goテンプレートを大規模に簡単に使用できるようにします。アクションの前後に呼び出される機能を登録します。

◇Echo

Echoは、パフォーマンスに焦点を当てた拡張可能なオープンソースのGo Webアプリケーションフレームワークです。これは、stdlib +ルーターとフルスタックWebフレームワークの間に位置するミニマリストWebフレームワークです。

◇Gofiber

Go Fiberは、ExpressにインスパイアされたGolangのフレームワークです。Go Fiberは、高速HTTPの上に構築されたWebフレームワークです。ルーティング/エンドポイント、ミドルウェア、サーバーリクエストなどの操作を処理するために使用できます。

◇Gorilla

Gorillaは、Goプログラミング言語のためのWebツールキットで、HTTPベースのアプリケーションを書くための有用で構成可能なパッケージを提供します。

6. ロギング

Goには、プログラマーがロギングを簡単に実装できるようにするための組み込み機能があります。また、サードパーティがロギングをさらに簡単にするための追加ツールを提供しています。

◇log/slog

logおよびlog/slog(Go 1.21以降)パッケージは、Goの標準ロギングパッケージです。これらのパッケージは、コンソールやファイルにメッセージをログ出力するためのシンプルなAPIを提供します。

◇Zap

Goでの高速で構造化されたレベル別ロギング。

  • オープンソース Zap

◇Zerolog

Zerologパッケージは、JSON出力に特化した高速でシンプルなロガーを提供します。

ZerologのAPIは、優れた開発者体験と驚異的なパフォーマンスを提供するように設計されています。そのユニークなチェーンAPIにより、Zerologはアロケーションとリフレクションを避けてJSON(またはCBOR)ログイベントを書き込むことができます。

7. リアルタイム通信

名前の通り、リアルタイム通信はリクエストを並行して効率的に処理することです。チャット/メッセージングアプリ、メールサービス、ゲームサーバー、またはオンライン共同プロジェクト(例: Excalidraw)など、リアルタイム通信を処理する方法はいくつかありますが、最も一般的なのはWebSocketを使用する方法です。その他のリアルタイム通信のオプションには、MQTTプロトコルやサーバー送信イベントなどがあります。

◇Melody

Melodyは、gorilla/websocketに基づくWebSocketフレームワークで、WebSocketの扱いにおける面倒な部分を抽象化します。リアルタイムアプリを簡単に作成できるようにします。

◇Centrifugo

Centrifugoは、オープンソースのスケーラブルなリアルタイムメッセージングサーバーです。Centrifugoは、サポートされているトランスポート(WebSocket、HTTP-streaming、SSE/EventSource、GRPC、SockJS、WebTransport)を介して接続されたアプリケーションのオンラインユーザーにメッセージを即座に配信できます。Centrifugoにはチャネルの概念があり、ユーザー向けのPUB/SUBサーバーです。

8. APIクライアント

APIクライアントは、コンピュータ上のアプリケーションから動作するツールとプロトコルのセットです。これらは、ウェブアプリケーションの開発時に毎回車輪の再発明をするのではなく、いくつかの操作をバイパスするのに役立ちます。クライアントAPIを使用することは、開発プロセスをスピードアップするための優れた方法です。

◇REST

REST(Representational State Transfer)API(Application Programming Interface)は、ウェブサイトを扱う際にユーザー機能を提供するために使用されます。HTTPリクエストを使用してREST APIと通信し、ユーザーがURLウェブサイトをナビゲートできるようにします。これらのURLは、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-go

GoのためのGraphQLパッケージ。

Gqlgen

ドキュメントによると、GolangでGraphQLサーバーを簡単に構築するためのライブラリです。

9. Goコードのテスト

Goには、プログラムをテストするために使用できる組み込みのテストコマンドがあります。

10. マイクロサービス向けツール

マイクロサービスは、ソフトウェア開発のアーキテクチャアプローチであり、明確に定義されたAPIを介して通信を行うデプロイ可能なサービスから分散アプリケーションを作成することを可能にします。モノリシックなアプリケーションに対する解決策です。

◇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ファーストの開発プラットフォームです。マイクロサービスアーキテクチャパターンを活用し、プラットフォームのビルディングブロックとして機能する一連のサービスを提供します。

◇go-zero

go-zeroは、多くのエンジニアリングベストプラクティスが組み込まれたWebおよびRPCフレームワークです。レジリエンス設計により、繁忙なサービスの安定性を確保するために生まれ、何百万人ものユーザーを抱えるサイトに長年サービスを提供しています。

◇Protocol Buffers

Protocol Buffers(Protobuf)は、構造化データをシリアライズするために使用される、無料でオープンソースの言語中立、プラットフォーム中立、拡張可能なデータフォーマットです。JSONに似ていますが、より小さく、高速で、ネイティブの言語バインディングを生成します。

Protocol Buffersを使用する利点は以下の通りです:

◇gRPC-Go

gRPCのGo言語実装(gRPCはRPC APIを実装するための技術です)。

◇Grpc gateway

gRPC-Gatewayは、gRPCサービスの上にレイヤーを作成し、クライアントに対してRESTfulサービスとして機能します。protocのプラグインです。gRPCサービスの定義を読み取り、RESTful JSON APIをgRPCに変換するリバースプロキシサーバーを生成します。

◇Twirp

Twirpは、シンプルさとミニマリズムを重視したサービス間通信のためのフレームワークです。API定義ファイルからルーティングとシリアライゼーションを生成し、HTTPメソッドやパス、JSONなどの雑事に悩むことなく、アプリケーションのロジックに集中できるようにします。