go語言學習之閉包函數
阿新 • • 發佈:2018-11-13
for test 執行c bsp () 執行 ack fun 在外
package main
import (
"fmt"
)
// 匿名函數1
func intSeq() func() int{
var arrInt = [10]int{1,2,3,4,5,6,7,8,9,10}
i := -1
return func() int{
i += 1
return arrInt[i]
}
}
// 帶參數匿名函數2
func intSeq2() func(index int) int{
var arrInt = [10]int{0,1,2,3,4,5,6,7,8,9}
i : = -1
return func(index int) int{
i += 1
return arrInt[index]
}
}
func testIntSeq(){
nextInt := intSeq()
fmt.Println(nextInt())
fmt.Println(nextInt())
}
func testIntSeq2(){
nextInt := intSeq2()
fmt.Println(nextInt(2))
fmt.Println(nextInt(5))
}
func testQuestion(){
var j int = 5
a := func() (func()){
var i int = 10
return func() {
fmt.Println(i, j)
}
}
b := a()
b()
}
func testQuestion2(){
var j int = 5
a := func() (func()){
var i int = 10
return func() {
fmt.Println(i, j)
}
}()
a()
}
func Question3() []func() {
b : = make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = func() {
fmt.Println(i)
}
}
return b
}
// 閉包通過引用的方式使用外部函數的變量。
// 上例中只調用了一次函數B,構成一個閉包,i 在外部函數B中定義,所以閉包維護該變量 i ,c[0]、c[1]、c[2]中的 i 都是閉包中 i 的引用。
// 因此執行c:=Question3()後,i 的值已經變為3,故再調用c[0]()時的輸出是3而不是0。
func testQuestion3(){
c := Question3()
c[0]()
c[1]()
c[2]()
}
func Question4() []func() {
b := make([]func(), 3, 3)
for i := 0; i < 3; i++ {
b[i] = (func(j int) func() {
return func() {
fmt.Println(j)
}
})(i)
}
return b
}
// 通過嵌套匿名函數的方式解決了testQuestion3的問題
func testQuestion4(){
c := Question4()
c[0]()
c[1]()
c[2]()
}
func main(){
// 測試1匿名函數1
testIntSeq();
// 測試2帶參數匿名函數
testIntSeq2();
// 測試3
testQuestion();
// 測試4
testQuestion2();
// 測試5
testQuestion3();
// 測試6
testQuestion4();
}
go語言學習之閉包函數