1. 程式人生 > >Go中函數、匿名函數和遞歸的使用

Go中函數、匿名函數和遞歸的使用

意思 傳遞 數字 字面量 ring 就是 遞歸 += 函數作為參數

// code_005_functions project main.go package main import ( "fmt" ) func Test1(a int, b, c string) (str3 string) { fmt.Printf("%d, %s, %s", a, b, c) return string(a) + b + c } func Test2() int { i := 1 sum := 0 for i = 1; i <= 100; i++ { sum += i } return sum } func Test3(num int) int { //遞歸函數的使用 if num == 1 { return 1 } return num + Test3(num-1) } //函數作為參數傳遞,我們使用type來定義 //它的類型就是所有擁有相同的參數,相同的返回值的一種類型。 type FuncType func(int, int) int //func後面沒有函數名 func Calc(a, b int, f FuncType) (result int) { result = f(a, b) return } func Add(a, b int) int { return a + b } func Minus(a, b int) int { return a - b } func squares() func() int { var x int return func() int { //匿名函數 x++ //捕獲外部變量 return x * x } } func main() { //關鍵func、函數名、參數列表、返回值、函數體和返回語句 //函數名首字母小寫即為private,大寫即為public //如果有返回值, 那麽必須在函數的內部添加return語句 str1 := Test1(11, "你好", "世界") fmt.Println("\n" + str1) //遞歸函數 sum := Test3(100) fmt.Println(sum) //函數作為參數傳遞 res1 := Calc(10, 20, Add) res2 := Calc(100, 60, Minus) fmt.Println(res1) fmt.Println(res2) //匿名函數與閉包 //所謂閉包就是一個函數“捕獲”了和它在同一作用域的其它常量和變量。 //這就意味著當閉包被調用的時候,不管在程序什麽地方調用,閉包能夠使用這些常量或者變量。 //它不關心這些捕獲了的變量和常量是否已經超出了作用域,所以只有閉包還在使用它,這些變量就還會存在。 //在Go語言裏,所有的匿名函數(Go語言規範中稱之為函數字面量)都是閉包。 str := "ck_god" f1 := func() { //方式1: fmt.Printf("哈哈哈,我是%s\n", str) } f1() func() { //方式2:匿名函數 fmt.Println("不好意思,還是我") }() type FuncType func() var f2 FuncType = f1 f2() //方式3:函數變量接收後調用 v := func(a, b int) (result int) { result = a + b return }(1, 1) //方式4:有參有返回值的匿名函數 fmt.Println("v=", v) //閉包捕獲外部變量特點:修改外部變量的值 fmt.Println("\n=========\n") i := 10 str2 := "ck_god" func() { i = 100 str = "go" fmt.Printf("內部:i = %d, str2 = %s\n", i, str2) }() fmt.Printf("外部:i = %d, str2 = %s\n", i, str2) //匿名函數作為返回值 f := squares() fmt.Println(f()) fmt.Println(f()) fmt.Println(f()) //我們看到變量的生命周期不由它的作用域決定:squares返回後,變量x仍然隱式的存在於f中 }

Go中函數、匿名函數和遞歸的使用