関数、匿名関数、実装インタフェース、閉鎖、変数、パラメータ、延期、パニックは、回復することを関数型

1、機能

1)ステートメント

関数宣言は、(省略してもよい)の値のリストを返し、関数、関数名、仮引数のリストを含みます。

FUNC関数名(パラメータリスト形式)(返されたリスト){
    関数本体
}

、リストは、戻り値を関数宣言が含まれている場合、機能しない限り、このような終わりに無限ループの存在下でパニック関数呼び出しまたは異常な機能として、実行しないように、最後にreturn文で関数が終了明白でなければなりません。

機能のタイプは、機能識別子と呼ばれ、2つの機能的な形態のパラメータリストとは、変数の型の対応値のリストを返す場合、2つの機能は、同じタイプと識別子、パラメータと戻り値を持っていると考えられています変数名は、彼らはタイプは形で表されたパラメータを省略することができるかどうかには影響しません識別子機能には影響を与えません。

すべての機能は、すべてのパラメータ引数の宣言順(パラメータ値)、関数呼び出しを呼び出すときに、囲碁の言語にはデフォルトパラメータ値ではありません、パラメータ名でパラメータを指定する方法はありませんので、正式に提供しなければならず、関数呼び出しが懸念されているため、変数名の戻り値は意味がありません。

関数は、引数の値は、関数のパラメータは引数のコピーであるので、引数が参照型を含む場合、そのようなポインタ、スラ​​イス(として、パラメータ引数は、しかし、影響を与えない変更するために、転送の方法によって渡さスライス)、マップ、機能、チャンネルタイプなど、間接参照機能ので、引数を変更してもよいです。

2)戻り値

リターン・パラメータの実装後に戻り値と複数の機能へのより容易なアクセス、多言語サポートの戻り値を移動します。

名前戻り値:戻り値が複数ある場合、戻り値は密閉型の複数囲み、それぞれの戻り値のタイプは、コンマで区切られました。

名前付き戻り値:ゴー言語サポートなどのパラメータにパラメータや戻り値として、戻り値に名前を付けるための変数名とタイプがあります。変数の型のデフォルト値戻り値に名前を付けます。関数本体の戻り値の名前の実施形態では、明示的に関数が戻るの終了前にreturn文を使用する必要があります。

名前付きおよび非という名前の戻り値パラメータが混在することはできません。

例:

メインパッケージ

インポート"FMT"を

メインfuncを(){ 
	X、Y:=(3,1)を追加
	fmt.Println(X、Y)
	、B:=サブ(1、3)
	fmt.Println(B)
} 

FUNC(X、Y INT)(整数、文字列){追加
	リターンX + Y、 "ハロー" 
} 

FUNCサブ(X、Y INT)(int型、B列){ 
	Y - = X 
	B = "hello"を
	リターン
}

  

2、無名関数

1)定義

匿名関数は、関数名のコンポーネントなし実装、関数宣言、関数本体の関数名を定義する必要はありません機能を指します。

次のように定義フォーマット匿名関数は次のようになります。

FUNC(パラメータリスト)(パラメータリストに戻る){
    関数本体
}

匿名関数は、文の後に呼び出すことができます。無名関数を割り当てることができます。

例:

メインパッケージ

インポート"FMT" 

{)(主FUNC 
	FUNC(STR列){//声明后马上调用
		fmt.Printf( "こんにちは、%S \ n"は、STR)
	}( "世界")
	
	F:= FUNC(STR列){ 
		fmt.Printf( "こんにちは、%S \ n"は、STR)
	} 
	F( "世界")
}

  

図3に示すように、インターフェイスを実装する機能タイプ

例:

主パッケージ
のインポート(
	「FMT」
//は、インタフェース呼び出し
インボーカ{インタフェースタイプを
	メソッドを呼び出す実装する//必要
	コール(インターフェース{})
} 
型として//関数が定義されている
タイプFuncCaller FUNC(インターフェースは{})
//インボーカに実装します呼び出し
FUNC(F FuncCaller)コール(インターフェース{P}){ 
	//本体関数fを呼び出す
	F(P)
} 
FUNCメイン(){ 
	//宣言インタフェース変数
	VARアンインボーカ呼び出し
	FuncCaller型へ//匿名関数は、割り当てをインタフェースに
	アン呼び出し= FuncCaller(FUNC(Vインタフェース{}){ 
		fmt.Println( "関数から"、V)
	})
	//利用インターフェースコールFuncCaller.Call、体内関数を呼び出し
	invoker.Call( "こんにちは")
}

  

4、閉鎖

ゴー言語クロージャの自由変数の関数への参照である、彼らは自由変数の環境を残しているにもかかわらず、共存するを参照自由変数や関数を解放または削除されることはありません、閉鎖は自由変数を使用し続けることができます。

それが基準環境によって「記憶」を組み入れた後にインスタンス化することができるような構造のタイプの関数として、関数自体は任意の情報、クロージャの形成のみが格納されていない、コンパイルされた静的な概念の関数であり、クロージャは動的な概念ランタイム。

その上側閉鎖スコープ変数は、実際の参照変数が変更される変数を修正、変更することができます。

 

 5、可変パラメータ

1)変数パラメータ・タイプ

可変パラメータは、引数の数は可変パラメータの種類が許容可能であるように関数を定義する必要があり、変数で渡されます。

FUNC FUNCNAME(引数...タイプ){
}

...フォーマット型の型のような形状パラメータの種類の関数が存在し、最後の引数でなければならないだけのようにシンタックスシュガー(糖衣構文)である、すなわち、言語の構文は、機能に影響を与えませんが、より便利にプログラマは、一般的に言えば、糖衣構文の使用は、それによってプログラムエラーの可能性を低減、プログラムの可読性を向上させることができます。

内部実装機構から、タイプ...タイプは、本質的に、上記のパラメータの引数は、各入力パラメータを取得するためのサイクルのために使用することができる理由である[]型である配列スライスです。

例:

メインパッケージ

インポート"FMT" 

FUNCのF(引数... int)を{ 
	_ため、引数:=レンジ引数{ 
		fmt.Println(引数)
	} 
} 
FUNCメイン(){ 
	F(1,2,3)
}

  

可変パラメータの2)は、任意のタイプ

あなたはどんなタイプを転送したい場合は、{}インターフェイスの種類を指定することができます。

例:

メインパッケージ
インポート"FMT" 
FUNCのMyPrintf(引数...インターフェイス{}){ 
	_ため、引数:=レンジ引数{ 
		。スイッチ引数(型){ 
		ケースINT:
			fmt.Println(argは、 "int値です。" )
		場合列:
			fmt.Println(argは、 "文字列値である。")
		ケースのInt64:
			fmt.Println(argは、 "Int64の値である。")
		デフォルト:
			fmt.Println(argは、 "未知のタイプです。" )
		} 
	} 
} 
FUNCメイン(){ 
	VAR V1 = 1 
	VAR V2のInt64 = 234 
	VAR V3 = "こんにちは" 
	VAR V4のfloat32 = 1.234 
	MyPrintf(V1、V2、V3、V4)
}

  

3)パラメーター関数の変数複数のパラメータを渡します

変数パラメータを使用すると、この変数は、次の変数パラメータに関数の可変パラメータを含んで渡す場合、変数は変数パラメータの後の経過時間に添加することができる、すべてのスライスが含まれている変数のパラメータである...セクションができるようにすることを、むしろ可変変数自体を渡すより転送要素。

 

6、延期

関数が(関数の終わりが正常に戻ることができ、ダウンタイムが発生したときにそれができる)延期に帰属戻るしようとしているときにその文の延期のGo言語は、ステートメントの遅延処理が続く、ステートメントの処理延期に応じて遅延します言うことです逆の実行は、最初は、最後の文が最終的に延期声明、最初に実行されるように、実行され延期されるように。

 

7、パニック 

ダウンタイムが発生したときにパニック()がトリガされると、()のコードの後ろにパニックが実行されませんが、()関数は、ダウンタイムが発生したときにアクションがパニックを発生し、まだ延期のステートメントの前に実行されました。

例:

主パッケージ
のインポート「FMT」
FUNCメイン(){ 
	延期fmt.Println(「の後に行うため、ダウンタイム。1」)
	延期fmt.Println(「2後に行うため、ダウンタイム」)
	パニック(「ダウン」)
}

  

8、回復

ゴー言語は、実装の通常の過程でのみ有​​効延期遅延機能を回復する、ビルトインされた回復ゴルーチンの流れの中にダウンすることができます機能の回復、コール回復はnilを返し、他の効果がありません、もし現在のゴルーチンパニック、呼び出しは、入力値がパニックと通常の実行を再開するために捕獲することができます回復します。

例:

主パッケージ
のインポート(
	「FMT」
	「ランタイム」
クラッシュコンテキスト情報渡す//必要
タイプstruct {panicContextの
	機能//文字列関数
} 
//保護モードが機能可能
FUNC ProtectRun(エントリFUNC()){ 
	//遅延の処理関数
	FUNC延期(){ 
		//ダウンタイムが発生している間、コンテキスト転送及び印刷パニック得る
		ERR:=回復() スイッチERR(タイプ){ 
		ケースruntime.Error://実行時エラー
			fmt.Println( "エラーランタイム: "ERR)
		デフォルト://エラーでない操作で
			fmt.Println("エラー"ERR)
		} 
	}()
	エントリ()
} 
FUNCのmain(){ 
	fmt.Println("プレ運転「)
	//多少の誤差が手動でトリガ可能
	ProtectRun(FUNC(){ 
		fmt.Println(「ダウン手動の前に」)
		//使用コンテキスト転送パニック
		パニック({&panicContext 
			"手動トリガパニック"、
		})
		fmt.Println( "マニュアルダウン後")
	})
	fmt.Println( "実行後")
}

  

組成物は、次のような特徴を持ってパニックと回復:

  • パニック回復しなかった、プログラムのダウンがあります。
  • あなたが対応延期を実行した後、現在の機能は、ダウンタイムポイントの後に続けてからプログラムがないダウン、撤退する、回復パニックもあります。

保留機能がトリガパニックで、プログラム全体がクラッシュするまでパニック、さらに投げエラー外部を起動し続けることができます。
あなたがエラーをキャプチャするときに、現在の関数の戻り値を設定したい場合は、直接設定戻り値という名前の戻り値を使用することができます。

おすすめ

転載: www.cnblogs.com/ACGame/p/11877645.html