一、函数的概念
函数是基本的代码块,用于执行一个任务。
语法:
func 函数名(参数列表) 返回类型{ //函数体 }
使用案例
func main() {
return_val := say_hi("cason")
fmt.Println(return_val)
}
func say_hi(name string) string {
fmt.Println("hello ", name)
return "someting"
}
二、Golang 特色函数多返回值
在其他语言中要让一个函数同时有多个值返回,得先将多个返回值处理成结构体或者是类的形式,但是用go语言来实现就十分轻松了
func main() {
sum1, sum2 := add_ten(10, 20)
fmt.Printf("sum1 = %d,sum2 = %d \n", sum1, sum2)
}
func add_ten(num1, num2 int) (int, int) {
return num1 + 10, num2 + 10
}
如果我们只想获得其中一个值,那么可以这样
sum1, _ := add_ten(10, 20)
fmt.Printf("sum1 = %d \n", sum1)
使用 _ 接收我们要忽略的值
三、参数的传递方式
函数的参数有两种传递方式,分别为值传递和引用传递。两者的主要区别为,值传递的特点为复制新值进行传递,在函数内修改值不会影响到原先的变量,而引用传递是使用指针进行传递,在函数内改变值将直接影响原来的变量。
值传递
func main() {
num := 10
result := add_ten(num)
fmt.Printf("old = %d,new = %d \n", num, result)
}
func add_ten(num1 int) int {
num1 += 10;
return num1
}
打印结果
num = 10, result = 20
可以看出 我们定义的 num
最后打印出来的结果还是与之前的一致。并没有因为函数中的操作而受到影响。这就是值传递的直观特点,我们在函数中操作的是复制出来的num
的副本
引用传递
func main() {
num := 10
result := add_ten(&num)
fmt.Printf("num = %d, result = %d \n", num, result)
}
func add_ten(num1 *int) int {
*num1 += 10
return *num1
}
打印结果
num = 20, result = 20
这次原来我们定义的num
也受到了影响,因为这次我们实际上是传递了num
的指针过去。所以我们在函数内对num
所做的操作是针对于num
本身而不是值传递那样子操作num
的副本。
四、函数作为值的使用
这个特点对用过 javascript 等语言的朋友应该不会陌生。在使用过程中我们可以将函数作为值保存在一个变量中,需要时直接使用变量名(...)
的方式进行调用。如下面的例子
func main() {
add_ten := func(num1 int) int {
return num1 + 10
}
fmt.Println(add_ten(10))
}
上面代码中我们把匿名函数赋值给了变量 add_ten
通过 add_ten(num)
五、函数闭包
关于闭包,这里将简单带过,后续会有专门的一篇博文来进行讲述,简单来说,闭包的特性使得我们可以使用函数内的变量而无需声明。请看下面例子
func main() {
func_1 := num()
fmt.Println(func_1())
fmt.Println(func_1())
fmt.Println(func_1())
fmt.Println("-------")
func_2 := num()
fmt.Println(func_2())
fmt.Println(func_2())
}
func num() func() int {
index := 0
return func() int {
index++
return index
}
}
打印结果
1
2
3
-------
1
2
从语法来看 我们定义了一个函数 func num()
其返回值为一个匿名函数 func() int
,而通过这个返回的函数,我们可以操作到函数中的变量 index
。
代码分析
func_1 := num()
执行完 num()
之后 相当于是
func_1 := func() int {
index++
return index
}
所以接下来调用 func_1()
即可得到 index 自增后的结果。其实换种写法也可以 num()()
,但是这种写法没有新的变量对其引用,所以在执行完之后,内存将会被释放。所以 num()()
无论连续调用多少次都不会有自增的效果。结果都将是 1
num()()//第一次
num()()//第二次
打印结果
1
1