本期给大家梳理下Go语言函数, 如下
函数是基本的代码块,用于执行一个任务。Go 语言最少有个 main() 函数。你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务。函数声明告诉了编译器函数的名称,返回类型,和参数。Go 语言标准库提供了多种可动用的内置的函数。例如,len() 函数可以接受不同类型参数并返回该类型的长度。如果我们传入的是字符串则返回字符串的长度,如果传入的是数组,则返回数组中包含的元素个数。
Go 语言函数定义格式如下:
func function_name( [parameter list] ) [return_types] {
函数体
}
函数定义解析:
func:函数由 func 开始声明
function_name:函数名称,函数名和参数列表一起构成了函数签名。
parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
函数体:函数定义的代码集合。
函数如果使用参数,该变量可称为函数的形参。
形参就像定义在函数体内的局部变量。
调用函数,可以通过两种方式来传递参数:
传递类型 | 描述 |
---|---|
值传递 | 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 |
引用传递 | 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。 |
// 获取房间状态
func GetRoomState(roomType int) (int,interface{}) {
rcdata :=GRoom[roomType].Data
return rcdata.GameState,rcdata.Data
}
函数用法 | 描述 |
---|---|
函数作为另外一个函数的实参 | 函数定义后可作为另外一个函数的实参数传入 |
闭包 | 闭包是匿名函数,可在动态编程中使用 |
方法 |
首先来看一段代码:
package main
import (
"fmt"
)
func squares() func() int {
var x int
return func() int {
x++
return x * x
}
}
func main() {
f1 := squares()
f2 := squares()
fmt.Println("first call f1:", f1())
fmt.Println("second call f1:", f1())
fmt.Println("first call f2:", f2())
fmt.Println("second call f2:", f2())
}
调试结果是这样的:
代码很简单,就是定义一个square函数,返回值类型是func() int,返回的这个函数就是一个闭包。
那么什么是闭包呢? 闭包是函数和它所引用的环境,也就是闭包=函数+引用环境。
匿名函数虽然没有定义x,但是它引用了他所在的环境(函数squares)中的变量x。f1跟f2引用的是不同的环境,在调用x++时修改的不是同一个x,因此两个函数的第一次输出都是1。函数squares每进入一次,就形成了一个新的环境,对应的闭包中,函数都是同一个函数,环境却是引用不同的环境。
我们在看一下上面的例子,发现变量x的生命周期不是由他的作用域所决定的,变量x在main函数中返回squares函数后依旧存在。变量x是函数squares中的局部变量,假设这个变量是在函数squares的栈中分配的,是不可以的。因为函数squares返回以后,对应的栈就失效了,squares返回的那个函数中变量i就引用一个失效的位置了。所以闭包的环境中引用的变量不能够在栈上分配。(出自:https://www.cnblogs.com/ralap7/p/9195677.html)
Golang语言情怀
ID:wwwGolangLtd
www.Golang.Ltd
游戏服务器架构丨分布式技术丨大数据丨Go语言学习