2.機能[golangとの旅]

で、「第一市民」としての機能をgolang:

  • 関数型は、関数型の変数は、他のパラメータまたは戻り値の関数として、変数の他のタイプと同様に使用することができるされて、直接呼び出しを行ってもよいです
  • マルチ戻り値戻り値をサポートしています
  • サポート閉鎖
  • サポート変数機能

そして、他の関数宣言キーワードFUNC、関数名、パラメータリストを含む言語、および関数本体のリストを返します。関数名は識別子の命名規則に従った場合の関数の最初の文字は、他のパッケージの可視性を決め、:他のパッケージ見える大文字を、同じパッケージにアクセスできる場合にのみ、小文字。

関数が値を返すことはできません、このデフォルト値は0を返します。

既知の関数は、変数の生体最も外側のローカル変数の名前、戻り値のパラメータ名に対応する機能は直接リターンを返さないことがあり、パラメータの最後の名前で、ゼロ値の型に初期化され、戻り値をサポートしています。

この関数はオーバーロードをサポートしていませんが、デフォルトのパラメータをサポートしていません。また、ネストされた関数定義の名前を(匿名関数とすることができる)をサポートしていません。

複数の値を持つ関数がリターンをサポートしていますイディオムがある:エラータイプ多値リターンがある場合は、最後の戻り値としてそれを取ります。

渡されたパラメータにgolang関数の引数が渡されたパラメータは、(そのパスポインタC ++のですか?ではない)、実際のポインタ値のコピーであるので、時々の変化の値への関数呼び出しの引数のポイントの後に、それは、常に値がコピーでありますパラメータは、パラメータがこのポインタ変数のコピーに渡され、ポインタ変数で同じアドレスに両方のポイント、パラメータの値は、まだ本質的にコピーを渡されました。

可変パラメータは、使用して宣言  のparamを...入力し  、この構文を。すべての変数のパラメータは同じタイプでなければならず、無期限のパラメータは、関数の最後のパラメータでなければなりません。スライスに対応する機能の体内の可変パラメータ名、スライスは、可変動作パラメータの操作に適しています。スライスは....追加するには、スライス名に続いて、変数パラメータにパラメータとして渡すことができます スライスのパラメータの関数として、未定義の関数パラメータと形状パラメータは、同じタイプではありません。

関数と呼ばれる署名関数型、最初の行で定義されたタイプの関数は、関数名を削除するための関数であり、パラメータ名{関数の型を印刷するために%Tのパラメータをフォーマットfmt.Printfを使用することができます。こと関数の同じ2つのタイプ:同じパラメータリストを持っていると値のリストを返す(要素のリストの順序、数および種類は同じである)、パラメータ名は異なっていてもよいです。

型は、型変数がパラメータまたは戻り値の関数として機能することができる機能のタイプを定義することができます。

タイプおよび機能地図、スライス、チャン、変数および関数名の種類の実際の機能は、ポインタ変数、関数コードの開始位置へのポインタポイントとして使用することができます。一般的に言えば、機能の種類は、参照型の変数、ゼロに初期化されていない変数のデフォルトのタイプの関数です。

関数名は、定数関数のタイプのよく知られた機能として見ることができる、あなたは直接関数型変数に直接割り当てることができ、関数名を使用して関数を呼び出すことができます。

匿名関数は、デジタル顔量として見ることができます。直接変数の関数型を使用してすべての場所には、匿名関数で置き換えることができます。匿名関数は、関数の変数に直接割り当てることができ、引数として使用することができ、戻り値として使用することができ、それはまた、直接呼び出すことができます。

golang提供延期キーワードは、あなたが複数の遅延コールを登録することができます。最後のアウト(FIFO)の順序でこれらの呼び出しは、関数が戻る前に実行されます。延期の共通言語は、リソースの一部は、最終的にリサイクルまたは解放されることを確実にします。延期の背後にある関数やメソッドを呼び出す必要があり、それは文にすることはできませんが、それ以外の場合は、延期中の式が関数呼び出しのエラーでなければなりません報告されます。

値をコピーして、渡された実際の延期登録する関数のパラメータ。延期文は延期位置復帰後の場合は実行されません、実行するために登録する必要があります。コールos.Exit(INT)への取り組みは、プロセスを終了するときは、延期もはや実行されないこと。

不適切な場所延期ステートメントはエラーチェックで文の次の文一般的に延期し、パニックを引き起こす可能性があります。

重大な副作用を持って延期:リソースの解放を遅らせるための延期は、通常の関数呼び出しに関して延期は、通常の関数呼び出しと比較して、間接的なデータ構造をサポートする必要がある、いくつかのパフォーマンスの損失があります。

クロージャは、典型的には、外部基準関数匿名関数またはグローバル変数構成パッケージ内のローカル変数によって物理的環境とその関連機能の組み合わせによって参照されています。= +クロージャ関数リファレンス環境。

外部環境の閉鎖クロージャを導入することは、直接コンパイラ検出に閉鎖を参照され、閉鎖は、ヒープに割り当てられた外部変数を参照されます。

関数は、関数のローカル変数のクロージャへの参照を返す場合:

  1. 各コール機能は、ローカル変数のためのメモリを割り当てますので、この関数を繰り返し呼び出して、外部の複数の変数は、複数のコピーを参照クロージャを返されました。
  2. クロージャは、それが参照する外部変数を変更する場合は閉鎖機能は、外部リファレンスを共有しているため閉鎖機能により複数回、それがクロージャと呼ばれるたびに、外部変数の両方に影響します。

クロージャ関数呼び出しがグローバル変数を変更するための参照を返した場合、各呼び出しは、グローバル変数に影響を与えます。クロージャは、クロージャをプログラムで良い参考にならないように、グローバル変数、グローバル変数を減らすために使用されています。

閉鎖の本来の目的は、暗黙の共有変数の移転の過程では、グローバル変数、関数呼び出しを減らすことです、その有益な側面を持っていますが、このように隠された共有変数の直接的な害をもたらすことがある場合を除き、十分に、明確ではない十分ではありません非常に価値のある場所は、一般的に我々はクロージャの使用をお勧めしません。

オブジェクトは、行動データが付随され、閉鎖は、データの挙動に取り付けられています。

golangがエラーを処理する2つの方法を提供し、1はパニックの手段によってスローと捕捉機構を回復し、もう一方は、エラーの間違った種類を使用しています。

アクティブのためのパニックは、エラーをスローし、キャッチミスに回復がスローパニック。パニックにつながる、2例があり、一つは、他のプログラムが実行時エラー検出を生成し、ランタイムによってスローされ、コール・パニック機能へのプログラムのイニシアチブです。

パニックが発生した後、層による関数呼び出しパニック位置か、すぐにパニックの発生場所、層からのリターンは、それがキャプチャされるまで、層伏在関数呼び出しスタックによって層、上方延期文関数を実行したり、最外層の機能を回復するために実行します終了します。

だけでなく、延期ロジックをキャプチャするために再び呼び出すか、パニックパニックを投げ、内部延期延期後の実行をパニックすることがあり、通常の流れを、スロー機能をパニック。

キャプチャパニックに回復し、パニック組織は上向きに合格し続けています。異常が出て合格していき、それ以外の場合はnilを返し、使用が回復し、延期一緒に、しかし、体の機能は、背後にあるだけ延期直接パニックの異常終了をキャプチャするために呼び出さ回復します。そこ複数の連続したパニックが投げ出されたかもしれませんが、唯一の最後のパニックをキャプチャすることができます。

広い意味でのエラー:望ましくない動作。狭い間違い:既知の望ましくない発生(エラーのタイプを参照期待と定義される)行動。例外:不明(知られているに反して)望ましくない動作。Goはトラップされないエラーが表示されない、と言うことですタイプセーフな言語、コンパイラとそれが実行されませんときにキャプチャすることはできませんランタイムエラー、ですので、このような観点から、無いわゆる例外があるに行きます「異常」すべて間違って登場。

golangのために2つのエラーハンドリングのメカニズムを提供します。

  1. エラーの種類を処理するためにエラー値が関数によって返されます。
  2. パニック印刷プログラムによって、コールスタックは、ハンドルエラーにプログラムの実行を停止します。

エラーの処理だから、2つの方法がありますが、一方が他方を直接呼び出しパニックは、エラーをスロープログラムを終了され、間違った型の値を返すことでエラーを処理することです。

実際のプログラミングでは、エラーやパニックの使用は、以下の3つのルールに従うべきです:

  1. ローカルコードの実装の結果は期待を満たしていませんが、事前に定義され、このような行動の誤差範囲は、エラー時に実行されていない以内に、このような非希望の動作は、プログラムは、このようなシーンは、関数が返すエラー型の変数を使用する必要があり、サービスを提供することはできませんしない原因エラー処理。
  2. エラーは、プログラムの実行中に発生した、エラーの種類がエラーランタイムエラーの所定の範囲内であり、この時間golangのデフォルトのアクションは、そのようなパニックは、プログラムの分岐流に発生した場合、主な機能には影響しませんが、パニックとの暗黙の契約を呼び出すことです捕捉パニックの上流に取り込まれるプログラム分岐を回復使用することができ、プロセス全体の崩壊を避けるためにトリガ
  3. サービスを提供し続けることができない、コードでこのようなシーンは、コールパニック終了するためのイニシアチブを取る必要があり、そのような行動は、誤差範囲内であらかじめ定義されたエラーを実行していないものの、プログラムのローカルコードの実行結果は、期待を満たしていないが、これは望ましくない動作を引き起こす可能性がプログラムの実行。

関数は、呼び出し元セーブモードを使用する関数は、頭と尾アセンブリコードのプッシュEBPはありませんので、すなわち、呼び出し側は、レジスタを保存する責任がある行く;このコードをMOV ESP EBP、呼び出された関数の呼び出しは、呼び出し元の関数と反対であります作用部位の保存修復前と後のシーンがあります。

アセンブリコンパイラによって生成されたコードは、抽象化の中間状態は、それがマシンコードにマップされていない、が、プラットフォームに依存しない中間状態は、コードのコンパイルいくつかのレジスタは、いくつかのような、抽象的であり、真であるアセンブラので説明行きます。

  • SB(スタティックベースポインタ、スタティックベースレジスタ)と一緒にグローバル変数のアドレスを表すグローバルシンボル。
  • FP(フレームポインタ、スタック・フレーム・レジスタ)現在のスタックフレームの関数呼び出しスタックボトム位置にポイントを登録します。
  • PC(プログラムカウンタ、プログラム・カウンタ)、次の命令の実行、レジスタ少し直接操作、通常、CALL、RET命令などの暗黙的な操作のアドレスを格納します。
  • SP(スタックポインタ、スタックレジスタ)、呼び出し関数値SPによって提供される関数呼び出しの前に一般的に割り当てまたは回収空間。

自動的に調整することがアセンブラインラインアセンブラ、アセンブリインライン行くと分解生成されたコードの一から一ではないが、主な違いは、サイトの保護を強化するだけでなく、関数呼び出しの前にPCを維持することで、SPは体重をオフセットロジックを配置します。分解より良い真の実行ロジックプログラムを反映しています。

おすすめ

転載: www.cnblogs.com/JHSeng/p/12141958.html