1. 函数简介
- 概念:每一个程序都包含很多函数,函数是基本的代码块
- Golang中拥有三种类型的函数
- 普通的带名字的函数
- 匿名函数或这lambda函数
- 方法
2. 函数的一般的定义格式
func func_name(args, args...) type {
// statement
}
Note:type
为函数的返回值类型
3. 按值传递和按引用传递
- 按值传递:Golang默认是按值传递,也就是传递参数的副本,函数在接收到参数的副本之后可能会对副本的值进行修改,但是不会影响原来的变量
- 按引用传递:如果你希望一个函数可以直接修改参数的值,而不是对其副本进行操作,你就需要在参数的前面加上&符号的形式传递给函数,这就是应用传递,此时传递给函数的参数就是一个指针。
4. 对函数的返回值进行命名
- Golang中允许你对函数的返回值类型进行命名
func getName(name string) n string {
return name
}
5. 传递变长参数
- 概念:如果函数的最后一个参数是采用
...type
的形式,那么这个函数就可以处理一个变长的参数,这个长度可以为0,这样的函数称为变参函数 - 其定义格式如下:
func long_args(args, kwargs, ...int) {
// statement
}
6. defer关键字
- 概念:关键字
defer
允许我们推迟到函数返回之前一刻才执行某个语句或函数
7. 一些内置函数
- close:用于管道
- len, cap:len用于返回某个类型的长度或数量;cap返回某个类型的最大容量(只能用于切片和map)
- new和make:均是用于内存分配;new用户用户自定义类型和值类型,例如结构;make用于用户内置引用类型(切片,map,管道)
- copy和append:用于复制和连接切片
- panic和recover:均用于错误处理
8. 递归函数
- 概念:当一个函数在函数体内调用自身,则称之为递归
package main
import "fmt"
func main() {
result := 0
for i := 0; i <= 10; i++ {
result = fibonacci(i)
fmt.Println(result)
}
}
func fibonacci(n int) (res int) {
if n >= 1 {
res = 1
} else {
res = fibonacci(n-1) + fibonacci(n-2)
}
return
}
9. 函数一等公民
- 函数可以作为其他函数的参数进行传递,然后在其他函数内调用执行,一般称为回调。
package main
import "fmt"
func main() {
callback(2, Add)
}
func Add(x, y int) {
fmt.Println(x+y)
}
func callback(z int, f func(int, int)) {
f(z, 5)
}
10. 闭包
- 概念:如果不希望给函数起名字的时候,就可以使用匿名函数
例如:
func(x, y int) int {return x + y}
这样的一个函数不能独立存在,会报编译错误,它必须赋值给一个变量,即把函数的地址赋值给一个变量,然后通过这个变量来调用这个匿名函数 - 自执行函数,就是在花括号后面加上一对圆括号,例如
func () { sum := 0 for i := 0; i <= 10; i++ { sum+=1 } fmt.Println(sum) }()
that's all
有疑问加站长微信联系(非本文作者)