語学学習(6)機能2が詳細に行きます

ディレクトリ

  • 変数のスコープと可視性
  • 無名関数
  • クロージャ
  • 演習

変数のスコープと可視性

1、グローバル変数量、ライフサイクル全体を通じて効果的なプログラム。

VARのint A = 10

  

図2に示すように、二つのタイプに分け、ローカル変数の量:

  1)関数の定義

  2)ブロック文文内で定義されました。

追加FUNC(int型、int型B){int型
 
     のvar SUM = 0 // INT変数SUMの部分量である     
     場合、A> 0 { 
         VARのINT = 100 C // Cは、可変レイアウトの量で有効であるがif文を文ブロック
     }
  
}

  

3.⻅視認性アクセス袋の関数である任意の量または可変とすることができます。

次に、パッケージの外に、したがって、特に大文字の最初の文字は、親はそれが他のパッケージや修正を使用することによってアクセスすることができ派生⺟ズームされます。

下部ケースは、プライベートを表し、ないパッケージの外からアクセスすることができません。

FUNC(int型、int型B){int型の追加
 
} 
、内部でのみトーンを使用してパッケージに追加//この関数はプライベートであり、パッケージの外側に調整することができないではありません

  

無名関数

図1に示すように、型の関数である、型関数の変数を定義することが可能です

FUNC追加(、BのINT)INTは{ 
	返す+ B 
} 

testFunc1(){FUNC 
	F1:=追加
	//%T函数类型
	fmt.Printf( "typeof演算F1 =%Tを\ n"、F1)
	合計:= F1 (2,5)
	fmt.Printf( "和=%d個の\ n"、和)
}

  

2、無名関数は、何の機能名、すなわちん

//匿名関数
FUNC testFunc2(){ 
	F1:FUNC =(A、Bはint){int型の
		戻りA + B 
	} 
	//関数型Tの%の
	fmt.Printf( "F1 = typeof演算%T \ N-"、F1)
	SUM: F1 =(2 ,. 5)
	fmt.Printf( "SUM D =%\ N-"、SUM)

}

  

3、無名関数の使用を延期

//延期应用
FUNC testFunc3(){ 
	VAR I = 0 int型
	//最后输出
	(I "延期I =%d個の\ n")fmt.Printfを延期
	I = 100 
	fmt.Printf( "I =%dの"、私)
	リターン
}

  

//延期+ =クロージャ匿名関数
FUNC testFunc4(){ 
	I = 0 int型VAR 
	//匿名関数最終出力+ 
	延期FUNC(){ 
		fmt.Printfを( "延期I D =%\ N-"、I)
	}()
	100 = I 
	fmt.Printf( "%D = I"、I)
	リターン
}

  

4パラメータの関数として

//函数作为参数
FUNC add_1(、BのINT)INT { 
	+ B戻り
} 

FUNCサブ(、Bのint)をINT { 
	返す- B 
} 

FUNC計算値(A、B int型、オペアンプFUNC(INT、INT) INT)INT { 
	戻りOP(B)
} 

testFunc5 FUNC(){ 
	合計:= CALC(100、300、add_1)
	サブ:= CALC(100、300、サブ)
	fmt.Printf(「和=%d個の副= %D \ n」は、和、サブ)
}

  

 

クロージャ

1、閉鎖:から周囲プライマーの使用に関連する機能⽽合わせエンティティ

//闭包

FUNC加算器()FUNC(あなた)あなた{ 
	VARのx're 
	//闭包
	(あなたに)戻りFUNCあなた{ 
		X +する= 
		Xを返します
	} 
}

FUNC testClosure1(){ 
//闭包累加
F:=アダー()
RET:= F(1)
fmt.Printf( "RET =%Dを\ n"、RET)
RET = F(20)
fmt.Printf(「RET =%D \ n」は、RET)
RET = F(100)
fmt.Printf( "" RET =%dは\ nを、RET)

//从0加起
F1:=アダー()
RET = F1(1)
FMT。 printf( "RET =%Dを\ n"、RET)
RET = F1(20)
fmt.Printf( "RET =%Dを\ n"、RET)
RET = F1(100)
fmt.Printf(「RET =%D \ n」は、RET)
}

  

2、パラメータを持つ閉鎖

//带参数闭包
FUNC追加(ベースINT)FUNC(INT)INT { 
	戻りFUNC(iは整数)INT { 
		塩基+ iは= 
		ベース返す
	} 
} 

testClosure2(){FUNC 
	TMP1を:=追加(10)
	fmt.Println( TMP1(1)、TMP1(2))
	TMP2:=(100)を追加
	fmt.Println(TMP2(1)、TMP2(2))
}

  

3、test.bmp、test.jpgパラメータの閉鎖

// test.bmp、test.jpg参数闭包
FUNC makeSufficxFunc(サフィックス文字列)FUNC(文字列)文字列{ 
	戻りFUNC(名前文字列)文字列{ 
		もし!strings.HasPrefix(名前、サフィックス){ 
			リターン名+サフィックス
		} 
		リターン名
	} 
} 

FUNC testClosure3(){ 
	関数func1:= makeSufficxFunc( "BMP ")
	関数func2("。JPG ")= makeSufficxFunc 
	fmt.Println(関数func1("試験"))
	fmt.Println(関数func2("試験"))
}

  

4、2つのクロージャは返します

FUNC計算値(ベースINT)(FUNC(INT)INT、FUNC(INT)INT){ 
	追加:=のFUNC(iは整数)、INT { 
		塩基が+ = iは
		基地返す
	} 

	サブ:=のFUNC(iは整数)、INT { 
		塩基- =私は
		ベース返す
	} 

	戻り追加、サブ
} 

testClosure4()FUNCを{ 
	F1、F2 = CALC(10)
	fmt.Println(F1(1)、F2(2))
	fmt.Println(F1(3)、F2(4) )
	fmt.Println(F1(5)、F2(6))
	fmt.Println(F1(7)、F2(8))
}

  

図5は、パラメータが必要で、そうでなければ結果は、パッケージ5

FUNC testClosure5(){ 
	// iについて:= 0; 私は<5。私は{++ 
	FUNC(){行く// 
	// fmt.Println(I)
	//}()
	//} 
	//time.Sleep(time.Second)の

	iについて:= 0; 私は<5。私は++ { 
		FUNC(インデックスint)を行く{ 
			fmt.Println(インデックス)
		}(I)
	} 
	time.Sleep(time.Second)
}

  

おすすめ

転載: www.cnblogs.com/wangshuyang/p/11761909.html