函数的go语言中的一级公民,我们把所有的功能单元都定义在函数中,可以重复使用。函数包含函数的名称、参数列表和返回值类型,这些构成了函数的签名(signature)。
函数在使用之前必须先定义,可以调用函数来完成某个任务。函教可以重复调用,从而达到代码重用。
定义格式
func function_name([parameter list])[return_types] {
函数体
}
语法解析
举例
func sum(a int, b int)(ret int) {
ret = a + b
return ret
}
func comp(a int, b int)(max int) {
if a > b {
max = a
}else {
max = b
}
return max
}
函数的返回值
函数可以有0或多个返回值,返回值需要指定数据类型,返回值通过return关键字来指定。return可以有参数,也可以没有参数,这些返回值可以有名称,也可以没有名称。go中的函数可以有多个返回值。
举例:
没有返回值
func f1() {
fmt.Printf("没有返回值,只进行一些计算")
}
有一个返回值
func sum(a int, b int) (ret int) {
ret = a + b
return ret
}
多个返回值,且在return中指定返回的内容
func f2()(name string, age int) {
name = "zjc"
age = 30
return name, age
}
多个返回值,返回值名称没有被使用
func f3()(name string, age int) {
name = "zjc"
age = 30
return //等价于return name,age
}
return覆盖命名返回值,返回值名称没有被使用
func f4()(name string,age int) {
n := "zjc"
a := 30
return n,a
}
Go语言函数不能嵌套,但是在函数内部可以定义匿名函数,实现一些简单功能调用。
匿名函数,就是没有名称的函数。
func (参数列表)(返回值)
举例
func main() {
max := func(a int, b int) int {
if a > b {
return a
}else {
return b
}
}
i := max(1, 2)
fmt.Printf("i: %v\n", i)
}
func main() {
//自己执行
func(a int,b int) {
max := 0
if a > b {
max = a
}else {
max = b
}
fmt.Printf("max: %v\n", max)
}(1, 2)
}
也可以把匿名函数定义成全局变量
var (
fun1 = func(n1 int, n2 int) int {
return n1 * n2
}
)
func main() {
fmt.Println(fun1(42, 44))
}
闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。或者说是函数和其引用环境的组合体。I闭包指的是一个函数和与其相关的引用环境组合而成的实体。简单来说,闭包=函数+引用环境
。首先我们来看一个例子:
func AddUpper() func (int) int {
var n int = 10
return func(x int) int {
n = n + x
return n
}
}
AddUpper()返回的匿名函数,引用了匿名函数外的n,所以AddUpper内部形成了闭包。AddUpper的调用如下:
f := AddUpper()
fmt.Println(f(1)) // 11
fmt.Println(f(3)) // 14
fmt.Println(f(3)) // 17
由于形成了匿名函数+外部引用的形式,所以每次调用AddUpper()时,n都会继承上一次调用的值。
就当n是AddUpper()的属性,一个对象只会初始化一次。
f := AddUpper()
fmt.Println(f(1)) // 11
fmt.Println(f(3)) // 14
fmt.Println(f(3)) // 17
g := AddUpper()
fmt.Println(g(4)) // 14
定义
defer特性
defer用途
举例
func main() {
fmt.Println("start")
defer fmt.Println("step1")
defer fmt.Println("step2")
defer fmt.Println("step3")
fmt.Println("end")
}
定义
init函数的特点
golang的初始化顺序
举例
var i int = initVar()
func init() {
//初始化
fmt.Println("init......")
}
func initVar() int {
//初始化变量
fmt.Println("initVar...")
return 100
}
func main() {
fmt.Println("main......")
}