## 一、函數定義
Go 語言函數定義格式如下:
~~~
func function_name( [parameter list] ) [return_types] {
函數體
}
~~~
函數定義解析:
* func:函數由 func 開始聲明
* function\_name:函數名稱,參數列表和返回值類型構成了函數簽名。
* parameter list:參數列表,參數就像一個占位符,當函數被調用時,你可以將值傳遞給參數,這個值被稱為實際參數。參數列表指定的是參數類型、順序、及參數個數。參數是可選的,也就是說函數也可以不包含參數。
* return\_types:返回類型,函數返回一列值。return\_types 是該列值的數據類型。有些功能不需要返回值,這種情況下 return\_types 不是必須的。
* 函數體:函數定義的代碼集合。
### 1、實例
~~~
package main
import "fmt"
/* 函數返回兩個數的最大值 */
func max(a, b int) int {
var results int
if a > b {
results = a
} else {
results = b
}
return results
}
/* 函數返回兩個數的最小值 */
func min(a, b int) (results int) {
if a > b {
results = b
} else {
results = a
}
return
}
func main() {
var a, b int = 20, 10
max := max(a, b)
min := min(a, b)
fmt.Printf("最大值為:%d\n", max)
fmt.Printf("最小值為:%d", min)
}
~~~
執行結果:
最大值為:20
最小值為:10
### 2、返回多個參數
~~~
package main
import "fmt"
/* 函數返回兩個數的最小值 */
func fun001(a, b int) (int, int) {
return a, b
}
func main() {
var a, b int = 20, 10
a1, b1 := fun001(a, b)
fmt.Println(a1)
fmt.Println(b1)
}
~~~
執行結果:
20
10
## 二、函數參數
~~~
package main
import "fmt"
func fun01(a int) {
a = 2
fmt.Println("fun01中傳入的值為:", a)
}
func main() {
var a int = 1
fmt.Println("main中的值第一次打印:", a)
fun01(a)
fmt.Println("main中調用fun01后打印:", a)
}
~~~
打印結果:
main中的值第一次打印: 1
fun01中傳入的值為: 2
main中調用fun01后打印: 1
## 三、閉包
~~~
package main
import "fmt"
func getSequence() func() int {
i := 0
return func() int {
i += 1
return i
}
}
func main() {
/* nextNumber 為一個函數,函數 i 為 0 */
nextNumber := getSequence()
/* 調用 nextNumber 函數,i 變量自增 1 并返回 */
fmt.Println(nextNumber())
fmt.Println(nextNumber())
fmt.Println(nextNumber())
/* 創建新的函數 nextNumber1,并查看結果 */
nextNumber1 := getSequence()
fmt.Println(nextNumber1())
fmt.Println(nextNumber1())
}
~~~
執行結果:
1
2
3
1
2