次のコラム Golang チュートリアル では、Go 言語でプログラミングすることの長所と短所を紹介します。
最近、私たちは、2009 年に Google が発表したオープンソース プログラミング言語である Go を使用して API を作成しました。 Go を開発に使用する過程で、私たちは多くの経験と洞察を得たので、それらを読者と共有したいと思い、この記事を書きました。
プロジェクトのプログラミング言語を選択するときは、プロジェクトの構築にどのプログラミング言語を使用するかを検討する前に、プロジェクトが何を構築するのかを理解することを常にお勧めします。製品をどのように構築するかについての決定要因とします。
ここでは、Go で開発する際に見つかった長所と短所をいくつか紹介します。これは、Go が次のプロジェクトを構築するのに適切な言語であるかどうかを理解するのに役立ちます。
Go 言語の使用は近年爆発的に増加しています。すべてのスタートアップがバックエンド システムにこれを使用しているようです。開発者らは、これほど人気があるのには多くの理由があると考えています。
Go 言語は非常に高速です
Go 言語は非常に高速なプログラミング言語です。 Go 言語はマシンコードにコンパイルされるため、解釈されるプログラミング言語や仮想ランタイムを持つプログラミング言語よりも当然パフォーマンスが向上します。 Go プログラムはコンパイルも非常に速く、結果として得られるバイナリは非常に小さくなります。私たちの API はわずか数秒でコンパイルされ、結果として得られる実行可能ファイルのサイズはわずか 11.5MB です。
習得が簡単
他の言語と比較して、Go 言語の構文は非常にシンプルで習得が簡単です。 Go の構文のほとんどは頭の中に入れておくことができるため、調べるのに多くの時間を費やす必要はありません。 Go 言語も非常にクリーンで読みやすいです。 Go 以外のプログラマ、特に C スタイルの構文に慣れているプログラマは、Go コードを読んで何が起こっているかを理解できます。
静的型定義言語
Go 言語は、強力な静的型定義言語です。 int、byte、string などの基本的な型があります。構造タイプもあります。他の厳密に型指定された言語と同様に、型システムにより、コンパイラーはクラス全体のエラーを検出できるようになります。 Go 言語にはリスト型とマップ型も組み込まれており、これらも使いやすいです。
インターフェイスの種類
Go 言語にはインターフェイスの種類があり、インターフェイスのメソッドを実装するだけで、どのような構造でもインターフェイスを満たすことができます。これにより、コード内の依存関係を分離できます。その後、テストで依存関係をモックすることができます。インターフェイスを使用すると、よりモジュール化されたテスト可能なコードを作成できます。 Go 言語には、開発者がより実用的な方法でコードを作成できるファーストクラスの関数もあります。
標準ライブラリ
Go 言語には、非常に優れた標準ライブラリがあります。基本的な型を操作するための便利な組み込み関数を提供します。 Web サーバーの構築、I/O の処理、暗号化技術の使用、生のバイトの操作を簡単に実行できるパッケージがあります。標準ライブラリによって提供される JSON のシリアル化と逆シリアル化は非常に簡単です。 「タグ」を使用すると、構造体フィールドの横に JSON フィールド名を指定できます。
テスト サポート
テスト サポートは標準ライブラリに組み込まれており、追加の依存関係は必要ありません。 thing.go というファイルがある場合は、thing_test.go という別のファイルにテストを記述し、「go test」を実行します。 Go はこれらのテストをすぐに実行します。
静的分析ツール
Go 言語には、強力な静的分析ツールが多数あります。特にツールの 1 つは gofmt で、Go が推奨するスタイルに従ってコードをフォーマットします。これにより、プロジェクトに関する多くの意見が正規化され、チーム マネージャーはコードによって行われる作業に集中できるようになります。各ビルドで gofmt、golint、および vet を実行します。警告が見つかった場合、ビルドは失敗します。
ガベージ コレクション
Go 言語が設計されたとき、メモリ管理は C や C よりも簡単になるように意図的に設計されました。動的に割り当てられたオブジェクトはガベージ コレクションされます。 Go 言語ではポインター演算が許可されていないため、ポインターの使用がより安全になります。値の型を使用するオプションも提供されます。
より簡単な同時実行モデル
同時プログラミングは決して簡単ではありませんが、Go では他の言語よりも同時プログラミングが簡単です。これは、「ゴルーチン」と呼ばれる軽量のスレッドを作成し、「チャネル」を通じて通信するのとほぼ同じくらい簡単ですが、より複雑なモデルも可能です。
先ほど説明したように、Go は確かに優れた言語です。構文が明確で、実行も高速です。多くの利点もあります。ただし、プログラミング言語は構文だけがすべてではありません。ここでは、私たちが遭遇した問題の一部を紹介します。
No Generics
まず第一に、この問題は部屋の中の象のようなもので、明白だが無視されている事実です。 Go 言語にはジェネリックスがありません。 Java のような言語を使用してきた開発者にとって、Go への移行は克服すべき大きなハードルです。これは、コードの再利用のレベルが低下することを意味します。 Go 言語にはファーストクラスの関数がありますが、「map」、「reduce」、「filter」などの関数を作成し、これらの関数を 1 つの型のコレクションで動作するように設計した場合、これらの関数を異なる型のコレクションで再利用することはできません。 。この問題を解決するには多くの方法がありますが、最終的にはより多くのコードを記述する必要があり、生産性と保守性が低下します。
インターフェイスは暗黙的です
インターフェイスがあるのは良いことですが、構造体は明示的ではなく暗黙的にインターフェイスを実装します。これが Go 言語の強みの 1 つであると言われていますが、インターフェースを実装しているかどうかを構造から判断するのは難しいことがわかりました。プログラムをコンパイルしてみることによってのみ実際に知ることができます。プログラムが小さい場合、これは確かに問題ではありません。しかし、プログラムが中規模から大規模になると、問題は大きくなります。
貧弱なライブラリ サポート
Go 言語ライブラリのサポートにはむらがあります。私たちの API は、公式にサポートされている Go SDK を持たない Contentful と統合されています。これは、Contentful からデータをリクエストして解析するために、多くのコードを作成 (そして保守!) する必要があることを意味します。また、サードパーティの Elasticsearch ライブラリにも依存する必要があります。ベンダーが提供する Go SDK は、Java、Ruby、または JavaScript の同等の SDK ほど人気がありません。
コミュニティのコミュニケーションは困難です
Go コミュニティは提案を受け付けない場合があります。 golint の GitHub リポジトリ: https://github.com/golang/lint/issues/65 でこの問題を検討してください。ユーザーは、警告が見つかったときに golint がビルドを失敗できるようにするよう要求しました (これがプロジェクトの問題で私たちが行っていることです) )。メンテナはそのアイデアを即座に却下しました。しかし、非常に多くの人がこの問題についてコメントしたため、メンテナーは要求された機能を 1 年後に追加することになりました。
Go コミュニティも Web フレームワークを好んでいないようです。 Go の HTTP ライブラリは多くの領域をカバーしていますが、パス パラメーター、入力のチェックと検証、または Web アプリケーションで一般的な横断的な問題はサポートしていません。 Ruby 開発者には Rails があり、Java 開発者には Spring MVC があり、Python 開発者には Django があります。しかし、多くの Go 開発者はフレームワークの使用を避けることを選択しています。しかし、実際には枠組みがないわけではなく、むしろたくさんあります。しかし、プロジェクトでフレームワークを使い始めると、放棄を避けるのはほぼ不可能です。
分割依存関係管理
長い間、Go 言語には安定した正式なパッケージ マネージャーがありませんでした。 Go プロジェクトは、長年にわたるコミュニティの懇願を経て、つい最近 godep をリリースしました。このギャップを埋めるツールはこれまでにたくさんありました。私たちはプロジェクトに非常に強力な govendor を使用していますが、これはコミュニティが断片化されていることを意味し、Go 言語に慣れていない開発者にとっては非常に混乱する可能性があります。さらに、ほぼすべてのパッケージ マネージャーは Git リポジトリを利用しており、Git リポジトリの履歴はいつでも変更される可能性があります。これを Maven Central と比較してください。Maven Central は、プロジェクトが依存するライブラリを削除したり変更したりしません。
Go 言語を使用するかどうかの決定
場合によっては、マシンの状況を考慮する必要があります。バイトを送受信するとき。数千の同時プロセスを管理する場合。オペレーティング システム、コンテナ システム、またはブロックチェーン ノードを作成している場合もあります。このような場合、ジェネリック医薬品は気にしないでしょう。チップからあらゆるナノ秒のパフォーマンスを絞り出すのに忙しいからです。
しかし、多くの場合、人間について考慮する必要があります。処理する必要があるビジネス ドメイン データ: 顧客、従業員、製品、注文。これらのドメイン エンティティで動作するビジネス ロジックを作成し、このビジネス ロジックを何年にもわたって保守する必要があります。そして、変化するニーズにできるだけ早く対応する必要があります。このような場合、開発者の経験が重要になります。
Go は、人間の時間よりもマシンの時間を重視するプログラミング言語です。現場では、マシンやプログラムのパフォーマンスが最も重要な場合があります。このような場合、Go は C または C の代替として適しています。しかし、典型的な n 層アプリケーションを作成する場合、データベース、そしてさらに重要なことに、データのモデル化方法でパフォーマンスのボトルネックが発生することがよくあります。
Go 言語を使用するかどうかを決定するときは、次の経験則を考慮してください:
バイトを扱う場合は、Go 言語が良い選択になるかもしれません。
データを扱う場合、Go 言語は適切な選択ではない可能性があります。
この状況は将来的に変わる可能性があります。 Go 言語とコミュニティはまだ非常に若いです。彼らは私たちを驚かせてジェネリックを追加するかもしれませんし、人気のある Web フレームワークが引き継ぐかもしれません。ただし、現時点では、ユニバーサル サポート、成熟した依存関係管理、およびビジネス ドメイン モデリングに重点を置いた成熟したプログラミング言語を使用し続けるつもりです。
その他の go 技術記事については、go 言語チュートリアル 列をご覧ください。
以上がGo言語でプログラミングするメリットとデメリットについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。