Golang 函数¶
函数定义¶
func functionName([parameter list] paraType) returnType {
// function body
}
函数调用¶
参数传递¶
在Golang中,参数传递都是值传递,不存在引用传递,即函数中对形参的操作不会改变函数作用域外实参的值。
函数变量¶
在Golang中,万物皆变量,函数也不例外。
Golang可以很灵活地创建函数,并作为另外一个函数的实参:
package main
import (
"fmt"
"math"
)
func main(){
/* 声明函数变量 */
getSquareRoot := func(x float64) float64 {
return math.Sqrt(x) // 求一个数的平方根
}
/* 使用函数变量调用函数 */
fmt.Println(getSquareRoot(9))
}
熟悉JS的话应该能发现这类似JavaScript中回调函数的使用:
package main
import "fmt"
// 声明一个函数类型
type fc func(int) int
func main() {
CallBack(1, callBack)//执行函数---CallBack
}
func CallBack(x int, f fc) { //定义了一个函数 testCallBack
f(x) //由于传进来的是callBack函数,该函数执行需要传入一个int类型参数,因此传入x
}
func callBack(x int) int {
fmt.Printf("我是回调,x:%d\n", x)
return x
}
函数闭包¶
所谓闭包,其实就是匿名函数+捕获的变量,类似C++中的lambda表达式与JavaScript中的箭头函数。
func counter() func() int {
i := 0
return func() int {
i += 1 // 这里捕获了变量i,每次调用匿名函数时,i的值都会被更新
return i
}
}
func main() {
nextCounter := counter()
fmt.Println(nextCounter()) // 1
fmt.Println(nextCounter()) // 2
nextCounter2 := counter()
fmt.Println(nextCounter2()) // 1
fmt.Println(nextCounter2()) // 2
}