関数:組織が良好で、実行タスクを指定したコードのブロックのために再利用することができます
ゴー言語サポート機能、匿名関数とクロージャ機能
囲碁言語定義関数は、キーワードFUNCを使用しています
FUNC関数名(パラメータ)(戻り値){ 関数本体 }
関数名:文字、数字、アンダースコア。しかし、関数名の最初の文字は数字にすることはできません。同じパッケージでは、関数名は同じ名前ではありません
パラメータ:パラメータ変数とパラメータ変数用組成物によるTypeパラメータは、複数のパラメータの間にカンマで区切っ
戻り値:変数の戻り値によって返された値と可変型組成物、ブラケットの戻り値が複数存在する場合にのみ、戻り値の型を書き込むことは、カンマで区切られた、ラップされなければなりません
関数本体:指定された機能ブロックを実現します
2つの数の実装と機能:
FUNC intSum(X int型、Y INT)INT { X + Yリターン }
関数のパラメータと戻り値は、我々はまた、機能がパラメータを取らない必要があります実装することができ、オプションであり、値を返しません
FUNCのsayHello(){ fmt.Println( "ハロー沙河") }
関数の呼び出し:
関数を定義した後、我々は機能囲まできる名前はここに呼び出し、関数を呼び出し、関数の戻り値がある場合、彼らはその値のリターンを受け入れることができません
パラメータ:
速記を入力します。
関数パラメータ隣接変数の同じタイプを省略することができる場合
intSum(X、Y INT)INT {FUNC リターンX + Y }
上記のコード、intSum関数は2つのパラメータがあり、これらの2つのパラメータがint型のタイプであり、タイプは後述するように、型はパラメータxのタイプであり、xが、yが入力したように省略されてもよいです
可変パラメータ:
変数のパラメータは、関数のパラメータの数が固定されていないです。識別するために、より...パラメータバックで言語変数パラメータを行くプラス
PS:通常、関数の最後のパラメータとして変数パラメータ
intSum2 FUNC(INT ... X){int型 fmt.Println(X)// Xあるスライス SUM = 0 _ため、V:範囲X = { SUM = SUM + V } 戻りSUM }
固定パラメータは、可変パラメータと一緒に使用される場合、変数パラメータは、固定パラメータの後ろに配置されなければなりません
intSum3(INTのX、Y ... INT)INT FUNC { fmt.Println(x、y)の 和:= X =レンジY {:_、V用の 和=和+ V } 戻り和 }
関数の可変パラメータは、本質的にスライスすることによって達成されます
戻り値:
ゴーreturnキーワード言語外部に出力戻り値
複数の戻り値:
Goでは、我々はすべての戻り値をラップするために括弧を使用する必要があり、複数の関数の戻り値がある場合、複数の言語は、戻り値を機能サポート
FUNC計算値(X、Y INT)(INT、INT){ 合計= X + Y サブ:= X - Y 戻り和、サブ }
戻り値は、指定されました:
関数定義は、リターンキーを通じて名に値を戻し、関数の本体に直接これらの変数を使用し、リターンされる場合があり
FUNC計算値(X、Y INT)(INTそう合計){ 合計= X + Y サブ= X - Y リターン }
延期声明:
その文の延期のGo言語が遅れるの文が続きます。この関数は、プロセスの延期所有権に復帰しようとするときに、最後の文が実行された延期された最初である文逆の順序で定義の実装を延期すること応じて、遅延されます、最初の最後の文は、延期を実行します
メインFUNC(){ fmt.Println( "開始") 延期fmt.Println(1) 延期fmt.Println(2) fmt.Println(3)延期 fmt.Println( "終了") } 開始 端を 3 2 1
遅延特性を呼び出す延期声明のためには、資源の問題を処理リリース延期声明のことができるようにするために非常に便利です。例:リソースのクリーンアップ、ファイルのロックを解除し、時間を記録するというように、閉じられています。
実行のタイミングを遅らせます。
return文の言語での移動機能を分割し、リターン命令RET 2つの段階に割り当てられている下部にあるアトミック操作ではありません。そして、文の時期延期する前に、戻り値の代入、RET命令実行後に実行されます
変数のスコープ:
グローバル変数:
グローバル変数は、プログラムの全体の動作サイクルが有効である範囲内それは、外側の関数で定義された変数です。機能では、グローバル変数にアクセス可能です
ローカル変数:
ローカル変数は二つのタイプに分けられます。
関数内で定義された変数は、外部関数で呼び出すことはできません
もしローカル変数と同じ名前のすべての変数、ローカル変数への優先アクセス
それだけで現在のステートメントブロック内で有効になりますため、場合に定義された変数
関数の型と変数:
関数の定義の種類:
あなたはタイプの関数を定義するタイプのキーワードを使用することができます
型計算FUNC(int型、int型)int型
上記のステートメントは、計算タイプを定義し、それは関数型であり、この関数はint型の2つのパラメータを受け取り、int型のパラメータを返します
長い間、この状態のような単純な用語では、計算機能のタイプの関数であります
関数型の変数:
あなたはタイプ関数の変数を宣言し、変数の代入のためにすることができます
メインFUNC(){ VARのC計算計算は、//タイプCの変数宣言 C = // Cに割り当てられた追加 fmt.Printf( "Cの種類:%T \ N-"、C)// Cのタイプ: main.calculation fmt.Println(C(1,2))//呼び出しがCとして追加するように呼び出し F:=変数F1に割り当てられた機能追加//追加する ( "Fの種類:%T \ N-" fmt.PrintfをF)// Fのタイプ:FUNC(INT、INT)INT fmt.Println(F(10、20である)// Fと同じ呼び出しの呼び出しを追加) }
高次機能:
二つの部分の戻り値としてのパラメータの関数と関数として分割
パラメータとして機能:
FUNC(X、Y INT)INT {追加 リターンX + Y } FUNC計算値(X、Y INT、オペアンプFUNC(INT、INT)INT)INT { 戻りOP(x、y)は } メイン(){FUNC RET2を:= CALC(10、20、追加) fmt.Println(RET2)// 30 }
の関数として値を返します:
FUNC(S文字列)(FUNC(int型、int型)int型、エラー){行う スイッチ{S :ケース"+" はnil、追加を返す : - ""ケース リターンサブ、nilの デフォルト: ERR:= errors.New(「ができませんオペレータ識別「) リターンゼロ、ERR } }
主パッケージ のインポート"FMT"は testInt FUNC型(INT)BOOL //関数の型宣言 (整数INT)FUNC ISODD {BOOL IF整数%2 == 0 { 偽に戻り } trueに戻り } (整数INT)FUNC ISEVEN {BOOL 整数%2 == 0 IF { trueに戻り } 偽に戻り } パラメータとしてこの場所で機能型//宣言 FUNCフィルタ(スライス[] INT、F testInt)[] {INT VAR結果[] INT _ため、値:=レンジスライス{ IF F(値){ 結果=アペンド(結果値) } } リターン結果 } FUNCメイン(){ スライス:= [] {INT 1,2 ,. 3 ,. 4 ,. 5 ,. 7} fmt.Println( "スライス="、スライス) ODD:=フィルタ(スライス、ISODD)//関数として渡された値 fmt.Println( "奇数スライスの要素がある:"、ODD) さえ:=フィルタ(スライス、関数として渡さISEVEN)//値 fmt.Println(「要素でさえスライスは、」偶数) }
testInt上記の2つのフィルタパラメータおよび関数の戻り値は、次に、関数型であるとtestIntこのタイプは、関数型である場合、2つのフィルタ機能する場合と、値型としての機能は、私たちはいくつかの共通のインタフェースを書くに非常に有用ですパラメータと戻り値testIntタイプは同じですが、私たちは、ロジックの様々なを実装することができ、それは私たちの非常に柔軟なプログラムになります
パニックと回復
ゴーはそのようなメカニズムを扱うJavaの例外のように、それは例外をスローしませんが、パニックの使用やメカニズムを回復しません。これはあなたのコードは、ささいなことでも、パニックにはならないことを意味し、最後の手段として使用する必要があります覚えておいてください。これは非常に強力なものです。
パニック:
内蔵された機能、パニック状態に元の制御フローを中断することができています。関数Fは、パニックを呼び出すと、関数Fの実行が中断されますが、F関数実行の遅延は、通常、コールの時点で場所呼び出し、それにF戻っは、パニックのようなFの振る舞いを呼び出します。このプロセスは、すべてのゴルーチン関数呼び出しの戻りでパニックが発生し、この時間のプログラムが終了するまで続けます。パニックは直接生成パニックを呼び出すことができます。また、そのようなアレイへのクロスボーダーのアクセスとして、実行時エラーによって生成することができます。
VARユーザー= os.Getenv( "USER") FUNCのinit(){ もしユーザ== "" { パニック( "$ USERなし値") } }
回復する:
内蔵されて回復ゴルーチンのパニックを入力することができる機能。だけ遅延機能を回復する有効です。実装の通常の過程では、コール回復はnilを返し、他の影響はありません。パニック状態に電流ゴルーチン場合、呼び出しは、入力値パニックを回復するために捕捉され、通常の実行を再開することができます。
その引数の機能が実装でパニックを生成するかどうかなどの次の関数をチェック
throwsPanic FUNC(F FUNC())(B BOOL){ 延期FUNC(){ IF X!=回復(); X =ゼロ{ B = trueに } }() F場合、F()//は、関数fを実行しますパニックがあった、そして、あなたが戻って復元することができます リターンを }
メイン関数init関数:
ゴー2つの予約機能があります。init機能(パッケージのすべてに適用することができる)と主な機能(本体のみパッケージ化するために適用されますが)。これら二つの機能は、任意のパラメータと戻り値を持たない定義されています。init関数の任意の数を書くことができますが、それは将来のための可読性や保守性のためであるかどうか、それはまだただのパッケージ内のinit関数を記述お勧めしますパッケージながら、
あなたはどこにでもこの2つの関数を呼び出す必要はありませんので、囲碁プログラムは自動的に、init()とメイン()を呼び出します。初期化関数内の各パッケージはオプションですが、メインパッケージには、主な機能が含まれている必要があります
初期化とプログラムの実行は、メインパッケージから始めます。メインパッケージは、他のパッケージに注いだ場合、それは彼らがインポートされたコンパイル時になります。時々、パッケージが複数のパッケージで同時にそこに導入される予定されて(例えば、多くのパッケージfmtをパッケージに使用される多くの時間をインポートする必要がないので、それだけで、一度にインポートされます、)一度、インポートされます。パケットが導入された場合、また、他のパッケージに注ぎ、それが最初に導入され、他のパッケージで来るし、次にこれらの変数をパッケージ化すると定数は初期化され、その後、いずれかが実行されます場合は(init関数の実行を開始します)、そして上のようにします。他のすべてのパッケージを導入ロードされ、それがメインパックに初期化されたパケット・レベルの定数と変数に始まり、その後、初期化機能メインパッケージを(存在する場合)を行い、最終的に主要な機能を実行します
全体の初期化パケットフローの導入の主な機能
インポート
頻繁にパッケージファイルをインポートするimportコマンドを使用しますコードを書く時に行く、私たちはしばしば見ることができます
インポート( "FMT" )
その後、我々はできます
fmt.Println( "こんにちは世界")
実際には、当然のことながら、モジュールのディレクトリをロードするためにGOROOT実行環境変数を行く、FMTは標準ライブラリの上に移動し、移動はまた、あなたが書いたロード・モジュールへのインポート、相対パスと絶対パスをサポートしています。
相対パス:
輸入「./model」と同じディレクトリにある//現在のモデル・ディレクトリー・ファイルが、インポートするには、このアプローチを推奨していません
絶対パス:
輸入 "SHORTURL /モデル" //ロードgopath / SRC / SHORTURL /モデルモジュール
インポートするいくつかの一般的な方法があります。
ポイント操作
インポート( "FMT" )
あなたは、このパッケージの関数を呼び出す際に、プレフィックス名は、このパッケージのインポートでポイント操作の後、あなたは、パッケージを省略することができます
エイリアス操作
インポート( F "FMT" )
接頭辞の私たち自身の定義をプログラミングする際に、機能パッケージ接頭辞を呼び出し
_操作
_実際には、動作はむしろ、パッケージ内部のダイレクト機能を使用するよりも、パッケージの導入が、init関数内のパッケージ・コール
無名関数、閉鎖
無名関数:
もちろん、それはまた、戻り値として機能することができますが、囲碁の言語で以前のように定義された内部関数としての機能はできません、とだけ匿名関数を定義することができます。定義によると、匿名関数function関数名ではありません
FUNC(パラメータ)(戻り値){ 関数本体 }
無名関数は機能名がありませんので、それは即時実行の関数として匿名関数や変数に保存する必要があるように、通常の関数のような呼び出しを行う方法はありませんので。
主FUNCは(){ //変数への匿名セーブ機能 追加:FUNC =(X、Yはint){ fmt.Println(X + Y) } 追加匿名関数を呼び出すことによって//変数(10、20である) //から実行します関数:関数定義エンドプラス匿名()を行う直接 FUNC(X、Yはint){ fmt.Println(X + Y) }(10、20です。) }