このコラムでは、主にプログラミング言語、システム アーキテクチャ、オープンソース フレームワーク、技術管理などを取り上げ、ソフトウェア分野の関連知識を包括的に解釈します。各トピックには複数の記事が含まれています。
この記事は、このコラムの最初の記事であり、GO 言語シリーズの最初の記事です。今日は、GO 言語についての全体的な印象をあらゆる面からお伝えしたいと思います。フォローアップ記事では、GO 言語の各機能とプログラミング スキルを紹介します。深さ。
はじめに
Go 言語の作者は、Robert Griesemer、Rob Pike、Ken Thompson です。その中でも Ken Thompson は、UNIX と C 言語の開発に多大な貢献をしたことでプログラマーによく知られています。これまでに Go で書かれたソフトウェアは何ですか? コンテナ ソフトウェアの Docker、基本ソフトウェアの ETCD と Kubernetes、データベース ソフトウェアの TiDB と InfluxDB、メッセージング システムの NSQ、キャッシュ コンポーネントの GroupCache です。
インフラストラクチャ ソフトウェアのほぼすべての分野で、Go 言語で書かれた新しいソフトウェアが登場し、これらのソフトウェアの市場シェアが上昇し続けていることがわかります。 Go 言語はインフラストラクチャ ソフトウェア用の言語であるだけでなく、サーバーサイドのユニバーサル言語としてもますます多くの開発傾向が見られます。Beego や Gorilla などの Go 言語 Web フレームワークの人気からもわかります。
サンプルプログラム
簡単なサンプルプログラムを通してGOのコーディングスタイルを見てみましょう:
Package main
import "fmt"
func main(){
fmt.Println ("hello, world");
}
上記のコードを実行するには? GO 言語は、プログラムのソース ファイルをマシン関連のネイティブ命令 (バイナリ) に変換するコンパイル言語です。最も基本的なツールは run コマンドで、1 つまたは複数の GO ソース ファイル (拡張子として .go が付きます) をコンパイルしてリンクできます。 リンク後、生成された実行可能ファイルが実際の操作を開始します。
1 .$go run helloworld.goここではコンパイル済み言語について説明しましたが、コンパイル済み言語で書かれたプログラムがマシンに認識される必要がある場合、コンパイルはソース コードをマシン コードにコンパイルすることです。 、リンクとは、それぞれを変換することです。 モジュールのマシンコードと依存ライブラリが連結されて、実行可能ファイルが生成されます。
コンパイル言語と比較して、インタープリタ言語はプログラムの実行時に一行ずつ翻訳するだけです。では、リンクとは正確には何でしょうか? リンクとロード、つまり、プログラムをメモリ内で実行できるようにコンパイル後にこれら 2 つの手順を実行することです。リンクは、複数のターゲット ファイルを完全なロード可能で実行可能なターゲット ファイルにリンクするコネクタを通じて完了します。プロセス全体には、シンボル解決 (ターゲット ファイル内のアプリケーション シンボルを対応する定義に関連付ける 2 つのステップ) とシンボルの関連付けが含まれます。メモリの場所を含む定義。
GO 言語の関数、定数、変数、型、ステートメント、ラベル、およびパッケージの名前には、比較的統一された命名規則があり、名前は文字またはアンダースコアで始まり、その後に任意の数字を続けることができます。 GO 言語では大文字と小文字が区別され、キーワードは名前として使用できないことに注意してください。単語で構成される名前に遭遇した場合、GO プログラマーは通常、「キャメルケース」スタイルを使用します。
StackOverFlow では、多くの人がこの種の問題を提起していますが、あまり注意を払う必要はなく、元のコードが存在するかどうかだけを考慮すればよい、という意見が主流です。存在しない場合は、使用しないようにしてください。また、「_」をできるだけ使用しないほうがよい理由として、ディスプレイの解像度が低いと「_」(下線が1本)と「__」(下線が2本)が肉眼で区別しにくくなるからという意見もありました。
個人的には、C言語のコーディング規約が原因ではないかと考えています。 C 言語では、システム ヘッダ ファイル内のマクロ名、変数名、および内部関数名は _ で始まるため、システム ヘッダ ファイルを #include すると、使用する名前と一致する場合、これらのファイル内の名前が定義されます。紛争はさまざまな奇妙な現象を引き起こす可能性があります。さまざまな情報に基づいて、読みにくくなったり、奇妙な問題が発生したりしないように、名前の先頭に「_」、「$」、またはスペースを使用しないことをお勧めします。
クラス名については、ロシアの Java 専門家である Yegor Bugayenko 氏が提案しています。クラス名が「-er」で終わる場合、これは推奨される命名方法ではありません。同氏は、この記事には例外があり、それは StringUtils、FileUtils、IOUtils などのツール クラスであると指摘しました。インターフェイス名には、IRecord、IfaceEmployee、RedcordInterface を使用せず、代わりに現実世界のエンティティの名前を使用してください。
もちろん、上記はすべて Java に関するものであり、GO とは何の関係もありません。GO 言語は C 言語の影響を受けています。
変数の概要
GO 言語には、変数 (var)、定数 (const)、型 (type)、関数 (func) の 4 つの主な宣言メソッドが含まれています。変数に関連するいくつかの感情について話しましょう:
1. var 宣言は、特定の型の変数を作成し、それに名前を付け、その初期値を設定します。それぞれの宣言は、var name type = 式という一般的な形式になります。もう 1 つ、Go 言語では空の文字列が許可され、null ポインター エラーは報告されません。
2. name:=expression を使用して変数を宣言できます。 = は宣言を意味し、= は代入を意味します。
変数の寿命が var x int の場合、式 &x (x のアドレス) は整数変数へのポインタを取得し、その型は整数ポインタ (*int) になります。値が p と呼ばれる場合、p は x を指している、または p には x のアドレスが含まれていると言えます。 p が指す変数は *p と書きます。式 *p は変数の値 (この場合は整数) を取得します。 *p はスカラーを表すため、代入演算子の左側に指定することもでき、変数の値を更新するために使用されます。
x:=1
p:=&x//p は整数ポインタであり、//x=2 と同等
fmt.Println(x)//出力 "2"
Java の NULL と比較すると、GO はポインター型のゼロ値が nil であることを意味することに注意してください。
}
var dummyイント
return &dummy
}
gofmt ツール
Gofmt は、プログラムを読み取り、フォーマットしたコードを出力する gofmt filename コマンドなどのフォーマットを実行します。サンプルプログラム (プログラム名demo.go) を見てみましょう:
ガベージコレクション
ガベージコレクターを知る方法高級言語の場合 変数はリサイクルすべきか? 基本的な考え方は、すべてのパッケージ レベルの変数と、現在実行中の関数のすべてのローカル変数を、変数をトレースするためのパスのソースとして使用できるということです。ポインターやその他の参照を通じて見つけることができます。変数のパスが存在しない場合は、スカラーにアクセスできなくなるため、他の計算には影響しません。
変数の有効期間は、変数に到達可能かどうかによって決まるため、ローカル変数は、それを含むループの 1 回の反復を超えて存在し続けることができます。
GO 言語のガベージ コレクターの設計目標は、ノンブロッキング コレクターであり、10 ミリ秒以内にリサイクルを実現します (実験によると、このステートメントは GC に十分な CPU 時間が存在する場合にのみ当てはまります。) 。設計原理の観点から見ると、Go のリサイクラーは、3 色のマーク アンド クリアを同時に実行するリサイクルラーであり、その設計アイデアは 1978 年に Dijkstra によって提案され、その目標は、最新のハードウェアと最新のハードウェアの特性と一致することです。ソフトウェアの低レイテンシのニーズは完全に一致します。 まとめ要約すると、すべての新しい言語には理由があって登場します。一般的に、主な理由は 2 つあります:
1. 現在の主流の言語では解決できない複雑なシナリオや特定の問題が発生しています。
2. よりコスト効率の高い言語が必要です。
完全に私情で何かを作るベル研究所を除けば、出口のない新技術を平気で打ち出す企業は無いと思います。ロブ・パイクが言ったように、「複雑さは乗算的に増大します。」 ある問題を解決するために、システムの特定の部分を少しずつ複雑にすると、必然的に他の部分も複雑になります。
システム機能、オプション、構成を追加し、迅速にリリースするという絶え間ないプレッシャーの下では、シンプルさが見落とされがちです。シンプルさを実現するには、プロジェクトの開始時にアイデアの本質を凝縮し、プロジェクトの全期間を通じてより具体的なガイドラインを作成して、どの変更が良いもので、どの変更が悪かったり致命的であるかを識別する必要があります。
私たちが十分に努力している限り、フレッド・ブルックスの言うソフトウェア設計の「概念的な整合性」を損なうことなく、良い変更を加えることによって目的を達成することができます。悪い変更はこれを行わず、致命的な変更は利便性のために単純さを犠牲にします。しかし、設計をシンプルにすることによってのみ、システムが成長しても安定性、安全性、および自己一貫性を維持することができます。 Go 言語には、言語自体、そのツール、標準ライブラリが含まれているだけでなく、極めてシンプルな動作文化も維持されています。