函數用於對代碼塊的邏輯封裝,提供代碼複用的最基本方式。使用func關鍵字聲明函數,其次是函數名,形參,返回值,函數體,形參和返回值若是沒有能夠省略。使用return關鍵字返回值。數組
示例1:無參數,無返回值bash
func helloWorld() { fmt.Println("Hello World") } helloWorld()
示例2:單個形參閉包
func sayHi(user string) { fmt.Println("Hi", user) } sayHi()
示例3:多個形參(類型合併)app
多個形參類型一致可只保留最後一個類型,形參能夠不使用ide
func sayHi(stu1,stu2 string, b1 bool){ fmt.Println("Hi",stu1) fmt.Println("Hi",stu2) } sayHi("alex","eric",false)
示例4:形參可變函數
可變參數只能定義一個,且只能在參數列表的最後,被調用時,可變參數被初始化爲對應類型的切片spa
func varArgs(args ...string){ fmt.Println(args) } varArgs("11","22","33") //調用可變參數 varArgs([]string{"11","22","33"}...) //切片解包後傳遞給可變參數函數
示例5:有參數,有返回值遞歸
返回值可指定變量名,變量在調用時會根據類型使用零值進行初始化,string
func add(n1,n2 int) (sum int){ return n1 + n2 } sum := add(1,2) fmt.Println(sum) 在調用 return時不須要添加返回值,go語言自動將變量的最終結果進行返回 在使用命名返回值時,當聲明函數中存在若多個連續返回值類型相同可只保,留最後一個返回值類型名 func add(n1,n2 int) (sum int){ sum = n1 + n2 return } sum := add(1,2) fmt.Println(sum)
示例6:多返回值it
在聲明函數時使用括號包含全部返回值類型,並使用 return關鍵字返回,值之間用逗號分割
func calc(n1,n2 int)(int,int,int,int){ return n1 + n2, n1 - n2, n1 * n2, n1 / n2 } sum, diff, product, quotient := calc(1,2) fmt.Println(sum, diff, product, quotient)
遞歸是指函數直接或間接調用本身,遞歸經常使用於解決分治問題,將大問題分解爲相同的小問題進行解決,須要關注終止條件。
示例:階乘
func fact(n int64) int64 { if n == 0 || n == 1 { return 1 } return n * fact(n-1) } func main() { fmt.Println(fact(5)) }
函數也能夠賦值給變量,存儲在數組、切片、映射中,也可做爲參數傳遞給函數或做爲函數返回值進行返回
定義函數類型的變量
var callback func(int, int) int
賦值爲函數
func add(n1,n2 int) int{ return n1 + n2 } callback = add
調用函數
fmt.Println(callback(1,2))
func tlAdd5(n int) int { return n + 5 } func makeMap(list []int, t1 func(int) int) []int { rt := []int{} for _,e := range list { rt = append(rt,t1(e)) } return rt } fmt.Println(makeMap([]int{1,2,3},tlAdd5))
不須要定義名字的函數叫作匿名函數,經常使用作幫助函數在局部代碼塊中使用或做爲其餘函數的參數
示例1:定義後直接賦值給變量,直接調用
add := func(n1,n2 int) int { return n1 + n2 }(1,2) fmt.Println(add)
示例2:參數類型爲函數的匿名函數
import ( "fmt" "strconv" ) func printResult(n1 int) string { return strconv.Itoa(n1) } func main(){ result := printResult(func(n1,n2 int) int { return n1 + n2 }(1,2)) fmt.Printf("%T,%v\n",result,result) }
閉包是指在函數內定義的匿名函數引用外部函數的變量,只要匿名函數繼續使用則外部函數賦值的變量不被自動銷燬
func generateId(start, step int) func() int { return func() int { id := start start += step return id } } g1 := generateId(1,2) g5 := generateId(5,5) fmt.Println(g1(),g5()) fmt.Println(g1(),g5())