待望の Go 1.18 プログラミング言語が、画期的なジェネリック機能を備えた製品リリースとしてついにリリースされました。これは、2012 年に Go 1.0 が最初にリリースされて以来、Go プログラミング言語に対する最も重要な変更を示しています。Go 1.18 は、3 月 15 日の時点で go.dev からダウンロードできます。
ジェネリクスは、Go プログラマーから最も要望の多かった機能であり、パラメーター化された型を使用したジェネリック コードのサポートを提供します。以降のリリースでは、より複雑な一般的なユース ケースをさらにサポートする予定です。ユーザーは、ジェネリック チュートリアルとリリース ノートを通じて、この機能に関する情報にアクセスできます。
Go 言語サーバーである gopls は、Visual Studio Code Go 拡張機能と共にジェネリックをサポートするようになりました。ジェネリックを使用して gopls をインストールする手順については、ドキュメントを参照してください。
Go 1.18 プロダクション リリースは、ベータ版とリリース候補版の段階に続きます。最初のリリースは 2022 年 2 月に予定されていましたが、3 月中旬まで延期されました。 12 月 14 日にデビューした Go 1.18 Beta 1 は、パラメータ化された型を使用した汎用コードをサポートする、Google が開発したオープンソース言語の最も重要なプレビュー リリースでした。このベータ バージョンは、これまでで最もダウンロード数の多い Go ベータ版でもあり、以前のベータ リリースの 2 倍のダウンロード数を誇っています。
ジェネリック プログラミングは、関数とデータ構造を一般的な形式で表現し、型を分解できる拡張機能です。これにより、コードの共有が容易になり、プログラムの構築が簡素化されます。
Go チームは、新しいジェネリック機能にアプローチする際には注意を促しました。これは、新しいバグが重要な新機能で表面化する可能性があるためです。さらに、特定の種類の再帰ジェネリック型など、特定の微妙なケースのサポートは、将来のリリースに延期されました。
この警告にもかかわらず、アーリー アダプターはこの新機能に満足していると報告されています。ジェネリックを使い始めるための簡単なチュートリアルは、こちらで公開されています。 2019 年 7 月のブログ投稿で報告されているように、Go にはジェネリック プログラミングの形式であるインターフェイス型がありましたが、Go 開発者がジェネリックに求めていた特定の側面が欠けていました。たとえば、Go ジェネリックの支持者は、スライスの要素の型に関係なく、Reverse のような関数を探しました。
Go 1.18 のリリースされたノートでは、次のようなその他の重要な機能も強調されています。
- プログラムがクラッシュしたり、無効な回答を返したりする原因となる入力を特定するための、ファジング ベースのテストを作成するための組み込みサポート。この機能は Go 1.18 で実験的です。
- 開発者が複数の Go モジュールを同時に操作できるようにする Go ワークスペース モード。より大規模なプロジェクトに不可欠です。
- コンパイラ フラグなどのビルドの詳細を記録する拡張された go version -m コマンド。
- ユーザーが AMD64 アーキテクチャの 4 つのバージョンから選択できるようにする GOAMD64 環境変数。
- Apple M1、ARM64、および PowerPC64 の CPU パフォーマンスが 20% も向上しました。これは、Go 1.17 レジスタ ABI 呼び出し規則がこれらのアーキテクチャに拡張されたことに起因します。
- Windows/Arm および Windows/Arm64 ポートは非協調プリエンプションをサポートするようになり、この機能を 4 つの Windows ポートすべてで利用できるようになり、長時間ブロックする Win32 関数を呼び出すときに発生する微妙なバグに対処できる可能性があります。
- ガベージ コレクションの実行頻度を決定するときにこれらのソースが含まれるため、GC 作業のヒープ以外のソースが重要な場合のガベージ コレクションのオーバーヘッドがより予測可能になります。
Go 1.17 が 8 月にリリースされました。 Go は、Docker コンテナー システムの開発での使用で最もよく知られており、同時実行を強力にサポートする、シンプルで習得しやすいプログラミング言語になるように設計されています。 AppMasterのプラットフォームなどのno-codeソリューションを検討して、Web、モバイル、およびバックエンド アプリケーションを作成したい開発者にとって、技術的負債を排除しながらアプリケーション開発をスピードアップし、コストを削減するのに役立ちます。