Go(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

行け
Go Logo Blue.svg
パラダイムマルチパラダイム同時機能[1] 命令型オブジェクト指向[2] [3]
によって設計されたロバート・グリーゼマーロブ・パイクケン

トンプソン
デベロッパー囲碁の作者[4]
初登場2009年11月10日; 11年前 (2009-11-10)
安定リリース
1.17.3 [5] Edit this on Wikidata / 2021年11月4日; 1日前 (4 November 2021)
規律の入力推定静的強い構造的[6] [7] 公称
実装言語Go、アセンブリ言語(gc); C ++(gofrontend)
OSDragonFly BSDFreeBSDLinuxmacOSNetBSDOpenBSD[8] Plan 9[9] SolarisWindows
ライセンス3条項BSD [4] +特許付与[10]
ファイル名拡張子。行く
Webサイトgolang .org
主要な実装
gc、gofrontend
に影響を受けた
C Oberon-2 Limbo Active Oberonシーケンシャルプロセスの通信 Pascal Oberon Smalltalk Newsqueak Modula-2 Alef APL BCPL Modula occamErlang
影響を受ける
オーディン、クリスタルジグ

Goがある静的型付けコンパイルされ たプログラミング言語で設計されたGoogleの[11]によってロバート・グリーズマーロブ・パイク、そしてケン・トンプソン[12] Goは構文的C似てますが、メモリの安全性ガベージコレクション構造型の型付け[6]、およびCSPスタイルの同時実行性を備えています。[13]この言語は、ドメイン名からGolangと呼ばれることがよくあります。golang.org、ただし、適切な名前はGoです。[14]

2つの主要な実装があります。

サードパーティのソースツーソースコンパイラであるGopherJS [20]はフロントエンドWeb開発用にGo toJavaScriptをコンパイルします

歴史

Goはマルチコアネットワークマシン、大規模なコードベースの時代におけるプログラミングの生産性を向上させるために、2007年にGoogle設計されまし[21]デザイナーは、グーグルで使用されている他の言語の批判に対処したかったが、それらの有用な特徴を維持した:[22]

設計者は主に、C ++に対する共通の嫌悪感に動機付けられました[24] [25] [26]

Goは2009年11月に公表され[27]、バージョン1.0は2012年3月にリリースされました。[28] [29] Goは、Google [30]や他の多くの組織やオープンソースプロジェクトで広く使用されています。

Goプログラミング言語のマスコットは上に示しGopherです。

2016年11月、GoおよびGo Monoフォントは、特にGoプロジェクトで使用するためにタイプデザイナーのCharlesBigelowおよびKrisHolmesによってリリースされました。GoはLucidaGrandeに似ヒューマニストのサンセリフで、GoMono等幅です。各フォントはWGL4文字セットに準拠しており、大きなエックスハイトと明確な文字形式で読みやすいように設計されていますGoとGoMonoはどちらも、斜線付きゼロ、小文字とテール、大文字とセリフを使用することによりDIN1450標準に準拠しています[31] [32]lI

2018年4月に、元のロゴは、後を追う流線を備えた、右に傾斜した様式化されたGOに置き換えられました。しかし、Gopherの マスコットは同じままでした。[33]

2018年8月、Goの主要な寄稿者は、互換性のない新しい「Go 2」言語機能、ジェネリックスエラー処理の2つの「ドラフトデザイン」を公開し、Goユーザーにフィードバックを送信するように依頼しました。[34] [35] Go 1.xでのジェネリックプログラミングのサポートの欠如とエラー処理の冗長性は、かなりの批判を集めました

バージョン履歴

Go 1は、言語仕様と標準ライブラリの主要部分の互換性[36]保証します。現在のGo1.17リリース[37]までのすべてのバージョンは、この約束を維持しています。

各メジャーGoリリースは、2つの新しいメジャーリリースが存在するまでサポートされます。[38]

囲碁のバージョン履歴
メジャーバージョン 最初のリリース日 言語の変更[39] その他の変更
1–1.0.3 2012-03-28 初回リリース
1.1–1.1.2 2013-05-13
  • Go 1.1では、定数ゼロによる整数除算は正当なプログラムではないため、コンパイル時エラーになります。
  • 文字列リテラルとルーンリテラルの定義が改良され、有効なUnicodeコードポイントのセットから代理の半分が除外されました。
  • 緩められた返品要件ルール。関数が関数の終わりに到達する前に常に戻ることをコンパイラーが証明できる場合は、最後の終了ステートメントを省略できます。
  • 言語は、実装がかどうかを選択することを可能にするintタイプとuintタイプが32または64ビットです。
  • 64ビットアーキテクチャでは、最大ヒープサイズが数ギガバイトから数十ギガバイトに大幅に拡大されました。
  • 標準ツールセットへのレース検出器の追加。
1.2–1.2.2 2013-12-01
  • この言語では、安全上の理由から、nilポインターの特定の使用により、実行時のパニックがトリガーされることが保証されるようになりました。
  • Go 1.2では、既存の配列またはスライスでスライス操作を使用するときに、容量と長さを指定する機能が追加されています。スライス操作は、作成済みの配列またはスライスの連続するセクションを記述することにより、新しいスライスを作成します。
  • ランタイムスケジューラは、(インライン化されていない)関数呼び出しで呼び出すことができるようになりました。
  • Go 1.2では、1つのプログラムが持つことができるスレッドの総数に構成可能な制限(デフォルトは10,000)が導入されています。
  • Go 1.2では、ゴルーチン作成時のスタックの最小サイズが4KBから8KBに引き上げられました。
1.3–1.3.3 2014-06-18 このリリースでは言語の変更はありません。
  • Go 1.3メモリモデルは、バッファリングされたチャネルでの送受信に関する新しいルールを追加し、バッファリングされたチャネルを単純なセマフォとして使用できることを明示します。チャネルへの送信を使用して取得し、チャネルからの受信を使用して解放します。
  • Go 1.3は、ゴルーチンスタックの実装を、古い「セグメント化された」モデルから連続したモデルに変更しました。
  • しばらくの間、ヒープ内の値を調べるときにガベージコレクターは正確でした。Go 1.3リリースでは、スタック上の値に同等の精度が追加されます。
  • 小さなマップでの反復は、一貫した順序で発生しなくなりました。これは、開発者が実装動作を悪用しているためです。
1.4–1.4.3 2014-12-10
  • 代入なしの範囲式
  • gcおよびgccgoでは、メソッド呼び出しの自動二重逆参照が許可されなくなりました。これは後方互換性のない変更ですが、言語仕様に沿っています。
  • 1.4では、ランタイムコードの多くがGoに変換され、ガベージコレクターがランタイム内のプログラムのスタックをスキャンして、アクティブな変数に関する正確な情報を取得できるようになりました。
  • アセンブラによって受け入れられる言語cmd/5acmd/6aありcmd/8a、主にランタイムへの型情報の配信を容易にするために、いくつかの変更が加えられました。
  • 内部パッケージの追加。
  • 新しいサブコマンドは生成します。
1.5–1.5.4 2015-08-19

見落としがあったため、スライスリテラルから要素タイプを削除することを許可するルールはマップキーに適用されませんでした。これはGo1.5で修正されています。

  • コンパイラとランタイムは、CなしでGoとアセンブラに実装されています。GoコンパイラとランタイムがGoに実装されているので、ソースからディストリビューションをコンパイルするには、Goコンパイラが使用可能である必要があります。これで、コンパイラーは自己ホスト型になります。
  • ガベージコレクターは1.5用に再設計されました。コレクターの「世界を止める」フェーズは、ほとんどの場合10ミリ秒未満であり、通常ははるかに短くなります。
  • Go 1.5では、ゴルーチンがスケジュールされる順序が変更されました。
1.6–1.6.4 2016-02-17 このリリースでは言語の変更はありません。
  • GoポインターをCコードと共有するためのルールを定義するcgoに大きな変更が加えられ、そのようなCコードがGoのガベージコレクターと共存できるようになりました。
  • Goパーサーは、生成される代わりに手書きされるようになりました。
  • このgo vetコマンドは、意図さPrintfれたf場所に渡す場合など、関数またはメソッドの値を引数として渡すことを診断するようになりましたf()
1.7–1.7.6 2016-08-15

言語仕様の終了ステートメントの明確化。これは既存の動作を変更しません。

  • 64ビットx86システムの場合、次の命令が(参照追加されたSSEを): 、PCMPESTRIRORXLRORXQVINSERTI128VPADDDVPADDQVPALIGNRVPBLENDDVPERM2F128VPERM2I128VPORVPSHUFBVPSHUFDVPSLLDVPSLLDQVPSLLQVPSRLDVPSRLDQおよびVPSRLQ
  • このリリースには、SSAに基づく64ビットx86システム用の新しいコード生成バックエンドが含まれています。
  • cgoを使用するパッケージには、Fortranソースファイル(C、C ++、Objective C、およびSWIGに加えて)が含まれる場合がありますが、Goバインディングでは引き続きC言語APIを使用する必要があります。
  • 新しいサブコマンド " go tool dist list"は、サポートされているすべてのオペレーティングシステム/アーキテクチャのペアを出力します。
1.8–1.8.7 2017-02-16

ある構造体タイプから別の構造体タイプに値を明示的に変換する場合、Go 1.8以降、タグは無視されます。したがって、タグのみが異なる2つの構造体は、一方から他方に変換できます。

  • 64ビットのx86システムの場合は、以下の命令が追加されました:VBROADCASTSDBROADCASTSSMOVDDUPMOVSHDUPMOVSLDUPVMOVDDUPVMOVSHDUP、とVMOVSLDUP
  • ガベージコレクションの一時停止は、Go 1.7の場合よりも大幅に短くする必要があり、通常は100マイクロ秒未満、多くの場合10マイクロ秒程度です。詳細については、stop-the-worldスタックの再スキャンの排除に関するドキュメントを参照してください。
  • 遅延関数呼び出しのオーバーヘッドは約半分に削減されました。
  • GoからCへの呼び出しのオーバーヘッドは約半分に削減されました。
1.9–1.9.7 2017-08-24
  • Goはタイプエイリアスをサポートするようになりました。
  • 浮動小数点演算で中間丸めを強制します。

Goコンパイラは、複数のコアを利用して、パッケージの関数を並列にコンパイルすることをサポートするようになりました。

1.10〜1.10.7 2018-02-16
  • 型なし定数のシフトを伴うコーナーケースが明らかになりました。
  • メソッド式の文法が更新され、構文が緩和され、任意の型式をレシーバーとして使用できるようになりました。

x86 64ビットポートの場合、アセンブラは、完全なAVX、AVX2、BMI、BMI2、F16C、FMA3、SSE2、SSE3、SSSE3、SSE4.1、およびSSE4.2拡張セットを含む359の新しい命令をサポートするようになりました。また、アセンブラは、条件フラグが予期せずクリアMOVL $0, AXれるのXORLを防ぐために命令として実装なくなりました

1.11〜1.11.6 2018-08-24 このリリースでは言語の変更はありません。
  • Go 1.11は、WebAssemblyに実験的なポートを追加します
  • Go 1.11は、「モジュール」と呼ばれる新しい概念の予備サポートを追加します。これは、バージョン管理とパッケージ配布の統合サポートを備えたGOPATHの代替手段です。
  • amd64のところ、アセンブラはAVX512命令を受け入れます。
  • Go 1.11は、WindowsXPおよびWindowsVistaのサポートを終了します。[40]
  • 1.11.3以降では、crypto / x509パッケージのTLS認証の脆弱性を修正します。[41]
1.12.1 2019-02-25 このリリースでは言語の変更はありません。
  • TLS1.3のオプトインサポート
  • 改善されたモジュールサポート(Go 1.13のデフォルトになる準備として)
  • へのサポート windows/arm
  • 改善されたmacOSとiOSの上位互換性
1.13.1 2019-09-03

Goは、より統一された最新の数値リテラルプレフィックスのセットをサポートするようになりました

  • デフォルトでは、crypto / tlsパッケージでのTLS1.3のサポート(オプトアウトはGo 1.14で削除されます)
  • エラーラッピングのサポート[42]
1.14 2020-02-25

重複するメソッドセットを持つインターフェイスの埋め込みを許可します[43]

これで、goコマンドのモジュールサポートが本番環境で使用できるようになりました[43]。

1.15 2020-08-11 このリリースでは言語の変更はありません。
  • 新しい埋め込みtime / tzdataパッケージ[44]
  • 動詞%#gを出力し%#G、浮動小数点値の末尾のゼロを保持するようになりました[45]
  • パッケージreflectは、エクスポートされていないすべてのフィールドのメソッドへのアクセスを禁止するようになりましたが、以前は、エクスポートされていない埋め込みフィールドのメソッドへのアクセスが許可されていました。
1.16 2021-02-16 このリリースでは言語の変更はありません。
  • goプログラム内にファイルを埋め込むための新しいサポート
  • macos / armのサポート
  • モジュール認識モードはデフォルトで有効になっています[46]
1.17 2021-08-16 スライスは、同じデータを指す配列ポインタに変換できるようになりました[47]。
  • Go 1.17は、関数の引数をスタックではなくレジスタに渡すようになり、平均で5%のパフォーマンス向上を実現します[47]。

デザイン

GoはC(特にPlan 9方言)の影響を受けますが、よりシンプルで安全性に重点が置かれています。言語は次のもので構成されています。

  • 動的言語でより一般的なパターンを採用する構文と環境[48]
    • オプションの簡潔な変数宣言と型推論による初期化またはのx := 0代わりに)。int x = 0;var x = 0;
    • 高速コンパイル。[49]
    • リモートパッケージ管理(go get[50]およびオンラインパッケージドキュメント。[51]
  • 特定の問題への特徴的なアプローチ:
  • 同様の言語で一般的な機能を一部省略して、プログラマーの頭に残るほど単純な言語仕様を維持したいという願望[52]

構文

Goの構文には、コードを簡潔で読みやすくすることを目的としたCからの変更が含まれています。合わせた宣言/初期化演算子は、書き込みにプログラマを可能に導入されたi := 3、またはs := "Hello, world!"タイプを指定せずに使用される変数のを。これは、Cint i = 3;およびとは対照的const char *s = "Hello, world!";です。セミコロンは引き続きステートメントを終了します[b]、行の終わりが発生すると暗黙的になります。[c]メソッドは複数の値を返す場合があり、result, errペアを返すことは、メソッドがGoで呼び出し元にエラーを示す従来の方法です。[d] Goは、名前で構造体パラメーターを初期化し、マップスライスを初期化するためのリテラル構文を追加しますCの3ステートメントforループの代わりに、Goのrange式を使用すると、配列、スライス、文字列、マップ、およびチャネルを簡潔に反復できます。[55]

タイプ

Goには、数値型(byteint64float32など)、ブール値、文字列(stringなど、多数の組み込み型があります文字列は不変です。(関数ではなく)組み込みの演算子とキーワードは、連結、比較、およびUTF-8エンコード/デコードを提供します。[56]レコードタイプstructキーワードで定義できます[57]

各タイプTおよび各非負の整数定数nには、[ n ] Tで示される配列タイプがあります。したがって、長さが異なる配列はタイプが異なります。動的配列は「スライス」として使用でき、一部のタイプTでは[] Tで示されます。これらには、アレイを拡張するために新しいメモリをいつ割り当てる必要があるかを指定する長さと容量があります。いくつかのスライスは、基礎となるメモリを共有する場合があります。[58] [59] [60]

ポインタはすべてのタイプで使用でき、Tへのポインタタイプは* Tで示されます。アドレス取得と間接参照では、Cのように演算子*演算子を使用するか、メソッド呼び出しまたは属性アクセス構文を介して暗黙的に発生します。[61] [62]ポインタ演算はありません、[e]標準ライブラリの特別なunsafe.Pointerを経由する場合を除きます。[63]

タイプKVのペアの場合、タイプmap [ K ] Vは、タイプKのキーをタイプVの値にマッピングするハッシュテーブルのタイプです。ハッシュテーブルは、特別な構文と組み込み関数を使用して、言語に組み込まれています。chan Tは、同時実行するGoプロセスでタイプTの値を送信できるようにするチャネルです[要出典]

インターフェイスのサポートは別として、Goの型システムは名目上ものです。typeキーワードを使用して、新しい名前付き型を定義できます。これは、同じレイアウトを持つ他の名前付き型とは異なります(構造体の場合、同じ順序)。型間(たとえば、さまざまな整数型間)の一部の変換は事前定義されており、新しい型を追加すると追加の変換が定義される場合がありますが、名前付き型間の変換は常に明示的に呼び出す必要があります。[64]たとえば、typeキーワードを使用して、32ビットの符号なし整数に基づいてIPv4アドレスの型を定義できます。

タイプ ipv4addr  UINT32

このタイプ定義では、ipv4addr(x)uint32xをIPアドレスとして解釈します。タイプipv4addrの変数にx割り当てるだけでは、タイプエラーになります。[引用が必要]

定数式は、型付きまたは「型なし」のいずれかです。それらが表す値がコンパイル時チェックに合格した場合、型変数に割り当てられたときに型が与えられます。[65]

関数タイプはfuncキーワードで示されます。それらは0個以上のパラメーターを取り、0個以上の返します。これらはすべて型指定されています。パラメータと戻り値は関数タイプを決定します。したがって、func(string、int32)(int、error)は、文字列と32ビットの符号付き整数を受け取り、(デフォルトの幅の)符号付き整数と組み込みインターフェイスタイプの値を返す関数のタイプです。エラー[引用が必要]

名前付き型には、メソッドセットが関連付けられています。上記のIPアドレスの例は、その値が既知の標準であるかどうかを確認する方法で拡張できます。

// ZeroBroadcastは、addrが255.255.255.255であるかどうかを報告します。
func  addr  ipv4addr  ZeroBroadcast () bool  { 
    return  addr  ==  0xFFFFFFFF 
}

記名的型付けのため、このメソッド定義はipv4addrメソッドを追加しますが、uint32には追加しませんメソッドには特別な定義と呼び出し構文がありますが、明確なメソッドタイプはありません。[66]

インターフェースシステム

Goは、クラス継承を置き換える2つの機能を提供します[引用が必要]

1つは埋め込みです。これは、自動化された形式の構成[67]または委任と見なすことができます[68] :255 

2つ目は、ランタイムポリモーフィズムを提供するインターフェイスです。[69] :266 インターフェースは型のクラスであり、Goの名目型システムで限定された形式の構造型を提供します。インターフェイスタイプのオブジェクトも別のタイプであり、C ++オブジェクトが同時に基本クラスと派生クラスであるのとよく似ています。 Goインターフェースは、Smalltalkプログラミング言語のプロトコルに従って設計されました[70]複数の情報源は、Goインターフェースを説明するときにダックタイピングという用語を使用しています。[71] [72]ダックタイピングという用語は正確に定義されていないため間違っていませんが、通常、タイプの適合性が静的にチェックされていないことを意味します。Goインターフェイスへの準拠はGoコンパイラによって静的にチェックされるため(型アサーションを実行する場合を除く)、Goの作成者は構造型という用語を好みます[73]

インターフェイスタイプの定義には、必要なメソッドが名前とタイプ別にリストされています。インターフェイスタイプIの必要なすべてのメソッドに一致する関数が存在するタイプTのオブジェクトも、タイプIのオブジェクトです。タイプTの定義は、タイプIを識別する必要はありません(また、識別できません)。たとえば、ShapeSquare 、Circleが次のように定義されている場合

 「数学」をインポートする

 シェイプ インターフェース {
    エリア() のfloat64 
}

type  Square  struct  {  //注:「実装」宣言
     float64はありません
}

FUNC  平方 スクエア エリア() のfloat64  { 戻り SQ サイド *  sq サイド }

入力 サークル 構造体 {  //ここいいえ「用具」宣言をいずれかの
    半径 のfloat64 
}

FUNC  C サークル エリア() のfloat64  { 戻り 数学円周率 * 数学捕虜c 半径 2  }

その場合、SquareCircleどちらも暗黙的にShapeであり、Shape型の変数に割り当てることができます。[69] :263–268形式言語では、Goのインターフェースシステムは、記名 型付けではなく構造型付けを提供します。インターフェースは、他のインターフェースを埋め込むことができ、埋め込まれたインターフェースを実装するタイプと、新しく定義されたインターフェースが追加するメソッドによって完全に満たされる結合インターフェースを作成する効果があります。[69] :270 

Go標準ライブラリは、インターフェイスを使用して、ReaderWriterの概念に基づく入出力システムを含むいくつかの場所で汎用性を提供します[69] :282–283 

Goでは、インターフェイスを介してメソッドを呼び出すだけでなく、実行時の型チェックを使用してインターフェイス値を他の型に変換できます。そうする言語構造は、型アサーション[74]は、単一の電位タイプ、およびに対してどのチェック型スイッチ[75]これは、複数の種類に対してチェックします。[引用が必要]

空のインターフェイスは interface{}、それがの項目を参照することができるので、重要な基本ケースである任意の具体的なタイプ。これはJavaまたはC#Objectクラスに似ており、intなどの組み込み型を含むすべての型で満たされます[69] :284 空のインターフェイスを使用するコードは、参照されるオブジェクトのメソッド(または組み込み演算子)を単純に呼び出すことはできませんが、を格納し、型アサーションまたは型を介してより有用な型に変換しようとします切り替えるか、Goのパッケージで検査してください[76]任意の値を参照できるため、静的型付けの制限を回避する方法は限られています。interface{}reflectinterface{}void*Cで、ただし追加のランタイムタイプチェックがあります。[引用が必要]

このinterface{}型は、JSONYAMLデータなど、Goの任意のスキーマの構造化データをmap[string]interface{}(文字列から空のインターフェースへのマップ)として表すことでモデル化できますこれは、文字列キーと任意のタイプの値を含む辞書の形式でデータを再帰的に記述します。[77]

インターフェイス値は、データへのポインターと実行時型情報への2番目のポインターを使用して実装されます。[78] Goでポインターを使用して実装された他のいくつかのタイプと同様に、インターフェース値はnil初期化されていない場合です。[79]

パッケージシステム

ゴーのパッケージシステムでは、各パッケージには、パス(例えば、持っている"compress/bzip2""golang.org/x/net/html")と名前を(例えば、bzip2またはhtml)。他のパッケージの定義への参照には、常に他のパッケージの名前を前に付ける必要あり、他のパッケージの大文字の名前のみにアクセスできます。io.Readerパブリックですが、そうでbzip2.readerはありません。[80]go getコマンドは、リモート・リポジトリに格納されているパッケージを検索することができる[81]と、開発者は、名前の衝突の可能性を減少させるために(例えばexample.com/user_name/package_nameなど)ソースリポジトリに対応するベースパス内のパッケージを開発することが奨励されます標準ライブラリまたは他の外部ライブラリへの将来の追加。[82]

PerlまたはRustの貨物システムまたはNodeのnpmシステムのCPANと同様のGoの適切なパッケージ管理ソリューションを導入する提案があります。[83]

並行性:ゴルーチンとチャネル

Go言語には、並行プログラムを作成するための組み込み機能とライブラリサポートがあります同時実行性とは、CPUの並列処理だけでなく、非同期性も指します。イベントベースのサーバーで一般的なように、プログラムが他の作業を行っている間、データベースやネットワークの読み取りなどの低速な操作を実行します。[84]

主要な並行性構造は、軽量プロセスの一種であるゴルーチンです。キーワードが前に付いた関数呼び出しは、新しいゴルーチンで関数を開始します。言語仕様では、ゴルーチンの実装方法は指定されていませんが、現在の実装では、Erlangで実行されるスケジューリングと同様に、Goプロセスのゴルーチンをオペレーティングシステムスレッドのより小さなセットに多重化します。[85] :10 go

古典的な同時実行制御構造(ミューテックスロックなど)のほとんどを備えた標準ライブラリパッケージが利用可能ですが、[85] :151–152 慣用的な並行プログラムは、代わりに、ゴルーチン間でメッセージ送信するチャネルを好みます[86]オプションのバッファはメッセージをFIFOの順序で保存します[68] :43 そしてメッセージが受信される前に送信ゴルーチンを続行できるようにします。[要出典]

チャネルはタイプされているため、タイプchan Tのチャネルは、タイプTのメッセージの転送にのみ使用できますそれらを操作するために特別な構文が使用されます。<-CHは、値がチャネル上に来るまでブロックに実行ゴルーチンを引き起こす式でCHながら、Xが- CH <値送るX(別のゴルーチン値を受信するまで、おそらくブロッキング)。組み込みのスイッチのようなselectステートメントを使用して、複数のチャネルでノンブロッキング通信を実装できます。以下を参照してください例として。Goには、データを安全に共有するためにゴルーチンがチャネルまたはその他の操作をどのように使用する必要があるかを説明するメモリモデルがあります。[87]

チャネルセットの存在は、メッセージがアクターに直接アドレス指定される(ゴルーチンに対応する)Erlangのようなアクターモデルスタイルの並行言語とは異なります。アクタースタイルは、ゴルーチンとチャネル間の1対1の対応を維持することにより、Goでシミュレートできますが、この言語では、複数のゴルーチンがチャネルを共有したり、単一のゴルーチンが複数のチャネルで送受信したりできます。[85] :147 

これらのツールから、ワーカープール、パイプライン(たとえば、ファイルがダウンロード時に解凍および解析される)、タイムアウト付きのバックグラウンド呼び出し、一連のサービスへの「ファンアウト」並列呼び出しなどの並行構造を構築できます。 。[88]チャネルは、リサイクルされたバッファの同時実行に安全なリストとして機能する、[89]コルーチンの実装(名前のゴルーチンのインスピレーションを助けた)、[90]イテレータの実装など、プロセス間通信の通常の概念からさらに離れた用途も発見しました[91]

Goの並行性に関連する構造規則(チャネルおよび代替チャネル入力)は、TonyHoareの 通信シーケンシャルプロセスモデルから派生していますOccamLimbo(Goの共同設計者であるRob Pikeが働いていた言語)などの以前の並行プログラミング言語とは異なり[92] Goは安全または検証可能な並行性の組み込み概念を提供しません。[93] Goでは通信プロセスモデルが好まれていますが、それだけではありません。プログラム内のすべてのゴルーチンが単一のアドレス空間を共有しています。これは、可変オブジェクトとポインタをゴルーチン間で共有できることを意味します。下記の§競合状態の安全性の欠如を参照してください[要出典]

並列プログラミングへの適合性

ゴーの同時実行機能は、主に目的としていませんが、並列処理[84]は、彼らは、プログラムに使用することができ、共有メモリ マルチプロセッサマシン。このアプローチの有効性については、さまざまな研究が行われています。[94]これらの研究の1つは、言語に精通していないベテランのプログラマーによって書かれたプログラムのサイズ(コード行)と速度、およびGoの専門家(Googleの開発チームから)によるこれらのプログラムの修正を比較しました。ChapelCilkIntelTBB。この調査では、専門家ではない人が分割統治アルゴリズムを1つで作成する傾向があることがわかりました。専門家がプロセッサごとに1つのゴルーチンを使用してdistribute-work-synchronizeプログラムを作成している間、再帰ごとにgoステートメント。専門家のプログラムは通常より高速でしたが、より長くなりました。[95]

競合状態の安全性の欠如

ゴルーチンが共有データにアクセスする方法に制限はなく、競合状態が可能になります。具体的には、プログラムがチャネルまたはその他の手段を介して明示的に同期しない限り、あるゴルーチンからの書き込みが部分的、完全に、またはまったく表示されない場合があり、多くの場合、書き込みの順序が保証されません。[93]さらに、インターフェイス値、スライスヘッダー、ハッシュテーブル、文字列ヘッダーなどのGoの内部データ構造は競合状態の影響を受けないため、同期せずにこれらのタイプの共有インスタンスを変更するマルチスレッドプログラムでは、タイプとメモリの安全性が侵害される可能性があります。[96] [97]したがって、言語サポートの代わりに、安全な並行プログラミングは規則に依存します。たとえば、Chisnallは、「エイリアスxor可変」と呼ばれるイディオムを推奨しています。これは、チャネルを介して可変値(またはポインター)を渡すと、その値の所有権がレシーバーに転送されることを意味します。[85] :155 

バイナリ

gcツールチェーンのリンカーは、デフォルトで静的にリンクされたバイナリを作成します。したがって、すべてのGoバイナリにはGoランタイムが含まれます。[98] [99]

省略

Goは、(実装)継承ジェネリックプログラミングアサーション[f] ポインター演算[e] 暗黙的な型変換タグなし共用体[g]タグ付き共用体など、他の言語で一般的な特定の機能を意図的に省略しています[h]設計者は、3つすべてが合意した施設のみを追加しました。[102]

代わりの使用奨励、より有用な言語を与えるように省略型継承する選択肢を守りながら省略言語機能を、設計者が明示的に、アサーション及びポインタ演算反論インターフェイス達成する動的ディスパッチを[I]組成リユースコードに。実際、構成と委任は、構造体の埋め込みによって大部分が自動化されています。研究者によると、シュマガーら。、この機能には「継承の多くの欠点があります。オブジェクトのパブリックインターフェイスに影響し、きめ細かくなく(つまり、埋め込みをメソッドレベルで制御できない)、埋め込みオブジェクトのメソッドを非表示にできず、静的です。 "、他の言語のプログラマーが継承を使いすぎると言われる程度にプログラマーがそれを使いすぎるかどうかを「明白ではない」ようにします。[67]

設計者はジェネリックプログラミングに対してオープンであることを表明し、組み込み関数実際には型ジェネリックであることに注意します、これらは特殊なケースとして扱われます。パイクはこれを弱点と呼んでおり、ある時点で変更される可能性があります。[58] Googleチームは、ジェネリックスを使用した実験的なGo方言用に少なくとも1つのコンパイラーを構築しましたが、リリースしませんでした。[103]コード生成を適用する方法を標準化することもできます。[104] 2020年6月に、新しいドラフト設計ドキュメント[105]が公開されました。これは、ジェネリック関数と型を宣言するために必要な構文をGoに追加します。コード翻訳ツールgo2goジェネリックス対応バージョンのオンラインGoPlaygroundとともに、ユーザーが新しい構文を試すことができるように提供されました。[106]

最初は省略されていましたが、パニック/リカバリメカニズムのような例外が最終的に追加されました。これは、Goの作成者が、プログラム全体やサーバーリクエストを停止する必要があるエラーなどの回復不能なエラーに使用するか、パッケージ内のスタックにエラーを伝播するショートカットとして使用することをお勧めします。 (ただし、パッケージの境界を越えてはいけません。エラーが返されるのは標準のAPIです)。[107] [108] [109] [110]

スタイル

Goの作成者は、Goプログラムのスタイルに影響を与えることに多大な努力を払っています。

  • コードのインデント、間隔、およびその他の表面レベルの詳細は、gofmtツールによって自動的に標準化されます。[111] golintは追加のスタイルチェックを自動的に行います。[引用が必要]
  • Goで配布されているツールとライブラリは、APIドキュメント(godoc)、[112]テスト(go test)、ビルド(go build)、パッケージ管理(go getなどへの標準的なアプローチを提案しています。
  • Goは、循環依存、未使用の変数[113]またはインポート、[114]、暗黙的な型変換の禁止など、他の言語で推奨されるルールを適用します
  • 省略特定の機能のは、(例えば、のような機能的なプログラミングのショートカットmapとJavaスタイルtry/finallyブロック)は、特定の明示的な、コンクリート、及び命令型プログラミングスタイルを奨励する傾向があります。
  • 初日、GoチームはGoイディオムのコレクションを公開し[112]、その後Goのスタイルとコーディング哲学を教えるためのコードレビューコメント[115]トーク、[116]および公式ブログ投稿[117]も収集しました

ツール

メインのGoディストリビューションにはコード構築テスト分析するためのツールが含まれています

  • go build、ソースファイル自体の情報のみを使用してGoバイナリを構築し、個別のmakefileは作成しません
  • go test、ユニットテストおよびマイクロベンチマーク用
  • go fmt、コードのフォーマット用
  • go install、リモートパッケージの取得とインストール用
  • go vet、コードの潜在的なエラーを探す静的アナライザー
  • go run、コードをビルドして実行するためのショートカット
  • godoc、ドキュメントを表示したり、HTTP経由で提供したりするため
  • gorename、変数や関数などの名前をタイプセーフな方法で変更するため
  • go generate、コードジェネレーターを呼び出す標準的な方法

また、プロファイリングデバッグのサポート、ランタイムインストルメンテーション(ガベージコレクションの一時停止を追跡するためなど)、および競合状態テスターも含まれます。

サードパーティツールのエコシステムはgocode、多くのテキストエディタでコードのオートコンプリートを有効にするgoimports、必要に応じてパッケージインポートを自動的に追加/削除errcheckする、エラーを意図せず無視する可能性のあるコードを検出するなどの標準ディストリビューションに追加されます

Hello world

パッケージ メイン

 「fmt」をインポート

func  main () { 
    fmt Println "Hello、world!" 
}

ここで、「fmt」は、CのCファイル入出力と同様に、フォーマットされたI / Oのパッケージです[118]

並行性

次の簡単なプログラムは、非同期プログラムを実装するためのGoの並行性機能示しています。2つの軽量スレッド(「goroutines」)を起動します。1つはユーザーがテキストを入力するのを待ち、もう1つはタイムアウトを実装します。選択ステートメントのメインルーチンにメッセージを送信するために、これらのゴルーチンのいずれかのための待ち、到着する最初のメッセージ(デビッドChisnallの本から適応例)に作用します。[85] :152 

パッケージ メイン

import  
    "fmt" 
    "time" 


func  readword ch  chan  string  { 
    fmt println "Enterキーを押し、その後、単語を入力してください。" 
    VARの 単語 
    FMT Scanf "%s"  word 
    ch  <- 単語
}

func  timeout t  chan  bool  { 
    time スリープ5  * 時間
    t  <  -false 
}

func  main () { 
    t  :=  make chan  bool 
    go  timeout t 

    ch  :=  make chan  string 
    go  readword ch 

    選択 {
    ケース ワード =  - < CH 
        FMTをPrintln "Received"  word 
    case  < -t 
        fmt Println "タイムアウト。" 
    } 
}

テスト

テストパッケージは、goパッケージの自動テストのサポートを提供します。[119]ターゲット関数の例:

func  ExtractUsername email  string  string  { 
	at  :=  strings Index email  "@" 
	return  email [:at ] 
}

テストコード(Goにはassertキーワードがないことに注意してください。テストは同じパッケージの<filename> _test.goにあります):

インポート 
    「テスト」    


FUNC  TestExtractUsername T  *試験T  { 
	T ファイル名を指定して実行"withoutDot"  FUNC T  *テストT  {
		ユーザー名 :=  ExtractUsername "[email protected]" 
		の場合 、ユーザ名 =! "R"  { 
			T Fatalf "ガット:体積%\ n"は ユーザ名
		} 
	})

	t ファイル名を指定して実行"withDot"  FUNC T  *テストT  {
		ユーザー名 :=  ExtractUsername "[email protected]" 
		の場合 、ユーザ名 =! "jonh.smith"  { 
			T Fatalf 「ガット:体積%\ n "  ユーザー名
		} 
	})
}

テストを並行して実行することが可能です。

Webアプリ

net / httpパッケージは、Webアプリケーションの作成をサポートします。

この例では、「Helloworld!」が表示されます。localhost:8080にアクセスしたとき。

パッケージ メイン

import  
    "fmt" 
    "log" 
    "net / http"     


FUNC  helloFunc W  HTTP ResponseWriter  R  * HTTP リクエスト { 
    FMT Fprintf w  "Hello world!" 
}

func  main () { 
    http HandleFunc "/"  helloFunc 
    ログ致命的HTTP ListenAndServe ":8080"  nilの))
}

アプリケーション

Goで書かれたいくつかの注目すべきオープンソースアプリケーションは次のとおりです。[120]

  • Caddy、自動HTTPS機能を備えたオープンソースのHTTP / 2Webサーバー
  • CockroachDB、オープンソース、存続可能、強一貫性、スケールアウトSQLデータベース
  • Consulは、DNSベースのサービス検出と、分散キー値ストレージ、セグメンテーション、および構成を提供するためのソフトウェアです。
  • DockerLinuxコンテナーをデプロイするためのツールのセット
  • Linux Foundationがホストするベンダー中立のオープンソースプラットフォームであるEdgeXは、産業用IoT エッジコンピューティングに共通のフレームワークを提供します[121]。
  • Hugo、静的サイトジェネレーター
  • InfluxDB、高可用性と高性能要件を備えた時系列データを処理するためのオープンソースデータベース
  • InterPlanetary File System、コンテンツアドレス可能、ピアツーピアハイパーメディアプロトコル[122]
  • ジュジュによるサービスのオーケストレーションツールCanonicalは、パッケージャのUbuntuのLinuxの
  • Kubernetesコンテナ管理システム
  • lnd、ビットコイン ライトニングネットワークの実装[123]
  • Mattermost、チームチャットシステム
  • NATSメッセージング、パフォーマンス、スケーラビリティ、および使いやすさのコア設計原則を特徴とするオープンソースメッセージングシステム[124]
  • OpenShiftによるサービスとして、クラウドコンピューティングプラットフォームのRed Hat
  • Rclone、クラウドストレージやその他の高遅延サービス上のファイルを管理するためのコマンドラインプログラム
  • てきぱきと、のためのパッケージマネージャのUbuntu Touchの正規によって開発されました
  • Syncthing、オープンソースのファイル同期クライアント/サーバーアプリケーション
  • TerraformHashiCorpのオープンソースのマルチクラウドインフラストラクチャプロビジョニングツール
  • TiDBPingCAPのMySQLプロトコルと互換性のあるオープンソースの分散HTAPデータベース

Goを使用している他の注目すべき企業やサイト(一般的に他の言語と一緒に、排他的ではありません)は次のとおりです。


ウィキデータに関連するクエリ も参照してください

レセプション

The interface system, and the deliberate omission of inheritance, were praised by Michele Simionato, who likened these characteristics to those of Standard ML, calling it "a shame that no popular language has followed [this] particular route".[148]

Dave Astels at Engine Yard wrote:[149]

Go is extremely easy to dive into. There are a minimal number of fundamental language concepts and the syntax is clean and designed to be clear and unambiguous. Go is still experimental and still a little rough around the edges.

Go was named Programming Language of the Year by the TIOBE Programming Community Index in its first year, 2009, for having a larger 12-month increase in popularity (in only 2 months, after its introduction in November) than any other language that year, and reached 13th place by January 2010,[150] surpassing established languages like Pascal. By June 2015, its ranking had dropped to below 50th in the index, placing it lower than COBOL and Fortran.[151] But as of January 2017, its ranking had surged to 13th, indicating significant growth in popularity and adoption. Go was awarded TIOBE programming language of the year 2016.

Bruce Eckel has stated:[152]

The complexity of C++ (even more complexity has been added in the new C++), and the resulting impact on productivity, is no longer justified. All the hoops that the C++ programmer had to jump through in order to use a C-compatible language make no sense anymore -- they're just a waste of time and effort. Go makes much more sense for the class of problems that C++ was originally intended to solve.

A 2011 evaluation of the language and its gc implementation in comparison to C++ (GCC), Java and Scala by a Google engineer found:

Go offers interesting language features, which also allow for a concise and standardized notation. The compilers for this language are still immature, which reflects in both performance and binary sizes.

— R. Hundt[153]

The evaluation got a rebuttal from the Go development team. Ian Lance Taylor, who had improved the Go code for Hundt's paper, had not been aware of the intention to publish his code, and says that his version was "never intended to be an example of idiomatic or efficient Go"; Russ Cox then optimized the Go code, as well as the C++ code, and got the Go code to run slightly faster than C++ and more than an order of magnitude faster than the code in the paper.[154]

Naming dispute

On November 10, 2009, the day of the general release of the language, Francis McCabe, developer of the Go! programming language (note the exclamation point), requested a name change of Google's language to prevent confusion with his language, which he had spent 10 years developing.[155] McCabe raised concerns that "the 'big guy' will end up steam-rollering over" him, and this concern resonated with the more than 120 developers who commented on Google's official issues thread saying they should change the name, with some[156] even saying the issue contradicts Google's motto of: Don't be evil.[157]

On October 12, 2010, the issue was closed by Google developer Russ Cox (@rsc) with the custom status "Unfortunate" accompanied by the following comment:

"There are many computing products and services named Go. In the 11 months since our release, there has been minimal confusion of the two languages."[157]

Criticism

Go critics say that:

Study shows that it is as easy to make concurrency bugs with message passing as with shared memory, sometimes even more.[165]

See also

Notes

  1. ^ Using alternative backends reduces compilation speed and Go's control over garbage collection but provides better machine-code optimization.[19]
  2. ^ But "To allow complex statements to occupy a single line, a semicolon may be omitted before a closing ) or }".[53]
  3. ^ "if the newline comes after a token that could end a statement, [the lexer will] insert a semicolon".[54]
  4. ^ Usually, exactly one of the result and error values has a value other than the type's zero value; sometimes both do, as when a read or write can only be partially completed, and sometimes neither, as when a read returns 0 bytes. See Semipredicate problem: Multivalued return.
  5. ^ a b Language FAQ "Why is there no pointer arithmetic? Safety ... never derive an illegal address that succeeds incorrectly ... using array indices can be as efficient as ... pointer arithmetic ... simplify the implementation of the garbage collector...."[12]
  6. ^ Language FAQ "Why does Go not have assertions? ...our experience has been that programmers use them as a crutch to avoid thinking about proper error handling and reporting...."[12]
  7. ^ Language FAQ "Why are there no untagged unions...? [they] would violate Go's memory safety guarantees."[12]
  8. ^ Language FAQ "Why does Go not have variant types? ... We considered [them but] they overlap in confusing ways with interfaces.... [S]ome of what variant types address is already covered, ... although not as elegantly."[12] (The tag of an interface type[100] is accessed with a type assertion[101]).
  9. ^ Questions "How do I get dynamic dispatch of methods?" and "Why is there no type inheritance?" in the language FAQ.[12]

References

funkyprogrammer.uk/concurrency-in-go-programming-language/

  1. ^ "First-Class Functions in Go". Retrieved November 14, 2018. Go supports ... a functional programming style in a strongly typed language.
  2. ^ "Is Go an object-oriented language?". Retrieved April 13, 2019. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.
  3. ^ "Go: code that grows with grace". Retrieved June 24, 2018. Go is Object Oriented, but not in the usual way.
  4. ^ a b "Text file LICENSE". The Go Programming Language. Retrieved October 5, 2012.
  5. ^ "Go 1.17".
  6. ^ a b "Why doesn't Go have "implements" declarations?". golang.org. Retrieved October 1, 2015.
  7. ^ Pike, Rob (December 22, 2014). "Rob Pike on Twitter". Retrieved March 13, 2016. Go has structural typing, not duck typing. Full interface satisfaction is checked and required.
  8. ^ "lang/go: go-1.4 – Go programming language". OpenBSD ports. December 23, 2014. Retrieved January 19, 2015.
  9. ^ "Go Porting Efforts". Go Language Resources. cat-v. January 12, 2010. Retrieved January 18, 2010.
  10. ^ "Additional IP Rights Grant". The Go Programming Language. Retrieved October 5, 2012.
  11. ^ Kincaid, Jason (November 10, 2009). "Google's Go: A New Programming Language That's Python Meets C++". TechCrunch. Retrieved January 18, 2010.
  12. ^ a b c d e f "Language Design FAQ". golang.org. January 16, 2010. Retrieved February 27, 2010.
  13. ^ a b Metz, Cade (May 5, 2011). "Google Go boldly goes where no code has gone before". The Register.
  14. ^ "Is the language called Go or Golang?". Retrieved March 26, 2020. The language is called Go.
  15. ^ "Go 1.5 Release Notes". Retrieved January 28, 2016. The compiler and runtime are now implemented in Go and assembler, without C.
  16. ^ "Go 1.11 is Released - The Go Blog". August 24, 2018. Retrieved January 1, 2019.
  17. ^ "Installing GCC: Configuration". Retrieved December 3, 2011. Ada, Go and Objective-C++ are not default languages
  18. ^ "FAQ: Implementation". golang.org. August 2, 2021. Retrieved August 2, 2021.
  19. ^ "gollvm § Is gollvm a replacement for the main Go compiler? (gc)". Git at Google.
  20. ^ "A compiler from Go to JavaScript for running Go code in a browser: Gopherjs/Gopherjs". April 18, 2020.
  21. ^ "Go at Google: Language Design in the Service of Software Engineering". Retrieved October 8, 2018.
  22. ^ Pike, Rob (April 28, 2010). "Another Go at Language Design". Stanford EE Computer Systems Colloquium. Stanford University. Video available.
  23. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org. Retrieved February 26, 2016.
  24. ^ Binstock, Andrew (May 18, 2011). "Dr. Dobb's: Interview with Ken Thompson". Retrieved February 7, 2014.
  25. ^ Pike, Rob (2012). "Less is exponentially more".
  26. ^ Griesemer, Robert (2015). "The Evolution of Go".
  27. ^ Griesemer, Robert; Pike, Rob; Thompson, Ken; Taylor, Ian; Cox, Russ; Kim, Jini; Langley, Adam. "Hey! Ho! Let's Go!". Google Open Source. Retrieved May 17, 2018.
  28. ^ Shankland, Stephen (March 30, 2012). "Google's Go language turns one, wins a spot at YouTube: The lower-level programming language has matured enough to sport the 1.0 version number. And it's being used for real work at Google". News. CNet. CBS Interactive Inc. Retrieved August 6, 2017. Google has released version 1 of its Go programming language, an ambitious attempt to improve upon giants of the lower-level programming world such as C and C++.
  29. ^ "Release History - The Go Programming Language". golang.org.
  30. ^ "Go FAQ: Is Google using Go internally?". Retrieved March 9, 2013.
  31. ^ "Go fonts – The Go Blog". Go. November 16, 2016. Retrieved March 12, 2019.
  32. ^ "Go Font TTFs". GitHub. Retrieved April 2, 2019.
  33. ^ "Go's New Brand". The Go Blog. Retrieved November 9, 2018.
  34. ^ "Go 2 Draft Designs". Retrieved September 12, 2018.
  35. ^ "The Go Blog: Go 2 Draft Designs". August 28, 2018.
  36. ^ "Go 1 and the Future of Go Programs - The Go Programming Language". golang.org.
  37. ^ "Go 1.17 Release Notes - The Go Programming Language". golang.org.
  38. ^ "Release History - The Go Programming Language". golang.org.
  39. ^ "Release History". The Go Programming Language. Retrieved August 24, 2018.
  40. ^ "Go 1.11 Release Notes – the Go Programming Language".
  41. ^ "Understanding Golang TLS mutual authentication DoS – CVE-2018-16875". December 19, 2018.
  42. ^ "Working with Errors in Go 1.13 - The Go Blog". blog.golang.org. Retrieved March 11, 2021. Go 1.13 introduces new features to the errors and fmt standard library packages to simplify working with errors that contain other errors. The most significant of these is a convention rather than a change: an error which contains another may implement an Unwrap method returning the underlying error. If e1.Unwrap() returns e2, then we say that e1 wraps e2, and that you can unwrap e1 to get e2.
  43. ^ a b "Go 1.14 Release Notes – the Go Programming Language".
  44. ^ "Go 1.15 is released - The Go Blog". blog.golang.org. Retrieved May 11, 2021. Go 1.15 includes a new package, time/tzdata, that permits embedding the timezone database into a program. Importing this package (as import _ "time/tzdata") permits the program to find timezone information even if the timezone database is not available on the local system. You can also embed the timezone database by building with -tags timetzdata. Either approach increases the size of the program by about 800 KB
  45. ^ "Go 1.15 Release Notes - The Go Programming Language". golang.org. Retrieved May 11, 2021.
  46. ^ "Go 1.16 Release Notes - The Go Programming Language". golang.org. Retrieved May 11, 2021.
  47. ^ a b "Go 1.17 Release Notes - The Go Programming Language". golang.org. Retrieved October 30, 2021.
  48. ^ Pike, Rob. "The Go Programming Language". YouTube. Retrieved July 1, 2011.
  49. ^ Pike, Rob (November 10, 2009). The Go Programming Language (flv) (Tech talk). Google. Event occurs at 8:53.
  50. ^ "Download and install packages and dependencies - go - The Go Programming Language". See godoc.org for addresses and documentation of some packages.
  51. ^ "GoDoc". godoc.org.
  52. ^ Pike, Rob. "The Changelog" (Podcast).
  53. ^ "Go Programming Language Specification, §Semicolons". golang.org.
  54. ^ "Effective Go, §Semicolons". golang.org.
  55. ^ "The Go Programming Language Specification - The Go Programming Language". golang.org.
  56. ^ Pike, Rob (October 23, 2013). "Strings, bytes, runes and characters in Go".
  57. ^ Doxsey, Caleb. "Structs and Interfaces — An Introduction to Programming in Go". www.golang-book.com. Retrieved October 15, 2018.
  58. ^ a b Pike, Rob (September 26, 2013). "Arrays, slices (and strings): The mechanics of 'append'". The Go Blog. Retrieved March 7, 2015.
  59. ^ Gerrand, Andrew. "Go Slices: usage and internals".
  60. ^ The Go Authors. "Effective Go: Slices".
  61. ^ The Go authors. "Selectors - The Go Programming Language Specification".
  62. ^ The Go authors. "Calls - The Go Programming Language Specification".
  63. ^ "Go Programming Language Specification, §Package unsafe". golang.org.
  64. ^ "The Go Programming Language Specification". golang.org.
  65. ^ "The Go Programming Language Specification". golang.org.
  66. ^ "The Go Programming Language Specification". golang.org.
  67. ^ a b Schmager, Frank; Cameron, Nicholas; Noble, James (2010). GoHotDraw: evaluating the Go programming language with design patterns. Evaluation and Usability of Programming Languages and Tools. ACM.
  68. ^ a b Summerfield, Mark (2012). Programming in Go: Creating Applications for the 21st Century. Addison-Wesley.
  69. ^ a b c d e Balbaert, Ivo (2012). The Way to Go: A Thorough Introduction to the Go Programming Language. iUniverse.
  70. ^ "The Evolution of Go". talks.golang.org. Retrieved March 13, 2016.
  71. ^ Diggins, Christopher (November 24, 2009). "Duck Typing and the Go Programming Language". Dr. Dobb's. Retrieved March 10, 2016.
  72. ^ Ryer, Mat (December 1, 2015). "Duck typing in Go". Retrieved March 10, 2016.
  73. ^ "Frequently Asked Questions (FAQ) - The Go Programming Language". golang.org.
  74. ^ "The Go Programming Language Specification". golang.org.
  75. ^ "The Go Programming Language Specification". golang.org.
  76. ^ "reflect.ValueOf(i interface{}) converts an interface{} to a reflect.Value that can be further inspected".
  77. ^ "map[string]interface{} in Go". bitfieldconsulting.com.
  78. ^ "Go Data Structures: Interfaces". Retrieved November 15, 2012.
  79. ^ "The Go Programming Language Specification". golang.org.
  80. ^ "A Tutorial for the Go Programming Language". The Go Programming Language. Retrieved March 10, 2013. In Go the rule about visibility of information is simple: if a name (of a top-level type, function, method, constant or variable, or of a structure field or method) is capitalized, users of the package may see it. Otherwise, the name and hence the thing being named is visible only inside the package in which it is declared.
  81. ^ "go - The Go Programming Language". golang.org.
  82. ^ "How to Write Go Code". golang.org. The packages from the standard library are given short import paths such as "fmt" and "net/http". For your own packages, you must choose a base path that is unlikely to collide with future additions to the standard library or other external libraries. If you keep your code in a source repository somewhere, then you should use the root of that source repository as your base path. For instance, if you have an Example account at example.com/user, that should be your base path
  83. ^ "Go Packaging Proposal Process". Google Docs.
  84. ^ a b Pike, Rob. "Concurrency is not Parallelism".
  85. ^ a b c d e Chisnall, David (2012). The Go Programming Language Phrasebook. Addison-Wesley. ISBN 9780132919005.
  86. ^ "Effective Go". golang.org.
  87. ^ "The Go Memory Model". Retrieved April 10, 2017.
  88. ^ "Go Concurrency Patterns". golang.org.
  89. ^ Graham-Cumming, John. "Recycling Memory Buffers in Go".
  90. ^ "tree.go".
  91. ^ Cheslack-Postava, Ewen. "Iterators in Go".
  92. ^ Kernighan, Brian W. "A Descent Into Limbo".
  93. ^ a b "The Go Memory Model". Retrieved January 5, 2011.
  94. ^ Tang, Peiyi (2010). Multi-core parallel programming in Go (PDF). Proc. First International Conference on Advanced Computing and Communications.
  95. ^ Nanz, Sebastian; West, Scott; Soares Da Silveira, Kaue. Examining the expert gap in parallel programming (PDF). Euro-Par 2013. CiteSeerX 10.1.1.368.6137.
  96. ^ Cox, Russ. "Off to the Races".
  97. ^ Pike, Rob (October 25, 2012). "Go at Google: Language Design in the Service of Software Engineering". Google, Inc. "There is one important caveat: Go is not purely memory safe in the presence of concurrency."
  98. ^ "Frequently Asked Questions (FAQ) - the Go Programming Language".
  99. ^ "A Story of a Fat Go Binary". September 21, 2018.
  100. ^ "Go Programming Language Specification, §Interface types". golang.org.
  101. ^ "Go Programming Language Specification, §Type assertions". golang.org.
  102. ^ All Systems Are Go. informIT. August 17, 2010. Retrieved June 21, 2018.
  103. ^ "E2E: Erik Meijer and Robert Griesemer – Going Go". Channel 9. Microsoft. May 7, 2012.
  104. ^ Pike, Rob. "Generating code".
  105. ^ "Type Parameters - Draft Design". go.googlesource.com.
  106. ^ "Generics in Go". bitfieldconsulting.com.
  107. ^ "Panic And Recover". Go wiki.
  108. ^ "Weekly Snapshot History". golang.org.
  109. ^ "Proposal for an exception-like mechanism". golang-nuts. March 25, 2010. Retrieved March 25, 2010.
  110. ^ "Effective Go". golang.org.
  111. ^ "gofmt - The Go Programming Language". golang.org. Retrieved February 5, 2021.
  112. ^ a b "Effective Go". golang.org.
  113. ^ "Unused local variables". yourbasic.org. Retrieved February 11, 2021.
  114. ^ "Unused package imports". yourbasic.org. Retrieved February 11, 2021.
  115. ^ "Code Review Comments". Retrieved July 3, 2018.
  116. ^ "Talks". Retrieved July 3, 2018.
  117. ^ "Errors Are Values". Retrieved July 3, 2018.
  118. ^ "fmt - The Go Programming Language". golang.org. Retrieved April 8, 2019.
  119. ^ "testing - The Go Programming Language". golang.org. Retrieved December 27, 2020.
  120. ^ avelino/awesome-go: A curated list of awesome Go frameworks, libraries and software, retrieved January 10, 2018
  121. ^ "EdgeX Foundry Project". GitHub. Retrieved February 6, 2021.
  122. ^ "ipfs/go-ipfs". GitHub. Retrieved June 1, 2018.
  123. ^ "lightningnetwork/lnd", GitHub, retrieved April 29, 2020
  124. ^ "NATS - Open Source Messaging System | Secure, Native Cloud Application Development".
  125. ^ "Test driven development in Go | Cacoo". Cacoo. July 29, 2016. Retrieved June 1, 2018.
  126. ^ "Chango". GitHub.
  127. ^ Heller, Martin (July 17, 2014). "Review: Cloud Foundry brings power and polish to PaaS". JavaWorld. Retrieved January 22, 2019.
  128. ^ Graham-Cumming, John. "Go at CloudFlare".
  129. ^ Graham-Cumming, John. "What we've been doing with Go".
  130. ^ "Go at CoreOS". November 25, 2014.
  131. ^ "Couchbase". GitHub.
  132. ^ Lee, Patrick (July 7, 2014). "Open Sourcing Our Go Libraries".
  133. ^ "Official Go implementation of the Ethereum protocol". GitHub. ethereum. April 18, 2020.
  134. ^ "Why we use Ruby on Rails to build GitLab". GitLab. Retrieved February 6, 2021. Ruby was optimized for the developer, not for running it in production," says Sid. "For the things that get hit a lot and have to be very performant or that, for example, have to wait very long on a system IO, we rewrite those in Go ... We are still trying to make GitLab use less memory. So, we'll need to enable multithreading. When we developed GitLab that was not common in the Ruby on Rails ecosystem. Now it's more common, but because we now have so much code and so many dependencies, it's going to be a longer path for us to get there. That should help; it won't make it blazingly fast, but at least it will use less memory
  135. ^ "dl.google.com: Powered by Go". golang.org.
  136. ^ Welsh, Matt. "Rewriting a Large Production System in Go".
  137. ^ Symonds, David. "High Performance Apps on Google App Engine".
  138. ^ "Mongo DB". GitHub. April 18, 2020.
  139. ^ "The Netflix Tech Blog: Application data caching using SSDs". May 25, 2016.
  140. ^ "golang/go". GitHub. April 18, 2020.
  141. ^ Sacks, Steven. "Search & Advances". plug.dj tech blog. Archived from the original on June 11, 2015. Retrieved June 10, 2015.
  142. ^ Jenkins, Tim (March 6, 2014). "How to Convince Your Company to Go With Golang". SendGrid's Email Deliverability Blog.
  143. ^ Bourgon, Peter. "Go at SoundCloud". Archived from the original on November 11, 2013.
  144. ^ "Go at Google I/O and Gopher SummerFest - The Go Blog". golang.org.
  145. ^ TWSTRIKE (April 17, 2020). "CoyIM". ThoughtWorks STRIKE team.
  146. ^ Hiltner, Rhys (July 5, 2016). "Go's march to low-latency GC".
  147. ^ "How We Built Uber Engineering's Highest Query per Second Service Using Go". Uber Engineering Blog. February 24, 2016. Retrieved March 2, 2016.
  148. ^ Simionato, Michele (November 15, 2009). "Interfaces vs Inheritance (or, watch out for Go!)". artima. Retrieved November 15, 2009.
  149. ^ Astels, Dave (November 9, 2009). "Ready, Set, Go!". engineyard. Retrieved November 9, 2009.
  150. ^ jt (January 11, 2010). "Google's Go Wins Programming Language Of The Year Award". jaxenter. Retrieved December 5, 2012.
  151. ^ "TIOBE Programming Community Index for June 2015". TIOBE Software. June 2015. Retrieved July 5, 2015.
  152. ^ Eckel, Bruce (August 27, 2011). "Calling Go from Python via JSON-RPC". Retrieved August 29, 2011.
  153. ^ Hundt, Robert (2011). Loop recognition in C++/Java/Go/Scala (PDF). Scala Days.
  154. ^ Metz, Cade (July 1, 2011). "Google Go strikes back with C++ bake-off". The Register.
  155. ^ Brownlee, John (November 13, 2009). "Google didn't google "Go" before naming their programming language'". Archived from the original on December 8, 2015. Retrieved May 26, 2016.
  156. ^ Claburn, Thomas (November 11, 2009). "Google 'Go' Name Brings Accusations Of Evil'". InformationWeek. Retrieved January 18, 2010.
  157. ^ a b "Issue 9 - go — I have already used the name for *MY* programming language". Github. Google Inc. Retrieved October 12, 2010.
  158. ^ a b Yager, Will. "Why Go is not Good". Retrieved November 4, 2018.
  159. ^ Elbre, Egon. "Summary of Go Generics discussions". Retrieved November 4, 2018.
  160. ^ a b Dobronszki, Janos. "Everyday Hassles in Go". Retrieved November 4, 2018.
  161. ^ Fitzpatrick, Brad. "Go: 90% Perfect, 100% of the time". Retrieved January 28, 2016.
  162. ^ "Why are there braces but no semicolons? And why can't I put the opening brace on the next line?". Retrieved March 26, 2020. The advantages of a single, programmatically mandated format for all Go programs greatly outweigh any perceived disadvantages of the particular style.
  163. ^ "I want off Mr. Golang's Wild Ride". February 28, 2020. Retrieved November 17, 2020.
  164. ^ "proposal: os: Create/Open/OpenFile() set FILE_SHARE_DELETE on windows #32088". May 16, 2019. Retrieved November 17, 2020.
  165. ^ Tu, Tengfei (2019). "Understanding Real-World Concurrency Bugs in Go" (PDF). For example, around 58% of blocking bugs are caused by message passing. In addition to the violation of Go's channel usage rules (e.g., waiting on a channel that no one sends data to or close), many concurrency bugs are caused by the mixed usage of message passing and other new semantics and new libraries in Go, which can easily be overlooked but hard to detect

Further reading

External links