go 函数
类似JavaScript
函数声明
func fuction_name([paramater_list]) [return_types] {
content
}
函数类型
- 无参无返回值函数
- 有一个参数的函数
- 有两个参数的函数
- 有个返回值的函数
- 有多个返回值的函数
// 无参无返回
func printInfo() {
fmt.Println("printinfo")
}
// 有一个参数无返回
func printInfo1(a string) {
fmt.Println(a)
}
// 有2个参数无返回
func printInfo2(a string, b int) {
fmt.Println(a + string(b))
}
// 有多个参数和多个返回值
func addAndSub(a, b int) (int, int) {
return a + b, a - b
}
形式参数和实际参数
- 形式参数:函数定义时,用来接受外部传入数据的参数,就是形式参数
- 实际参数:调用函数时,传给形参的实际数据叫做实际参数
- 可变参数:函数定义时,参数名+…+类型表示可变参数;一个函数有多个参数时,可变参数一定要放最后面,并且一个函数只会有一个可变参数。
参数传递
按数据存储的特点分:
- 值类型的数据:操作的是数据本身,int、string、bool、float64、array等(java中的基本类型)
- 引用类型的数据:操作的是数据的地址slice、map、chan等(java中的封装类型)
值传递:传递的类型是值类型数据
引用传递:传递的是引用类型的数据
defer 延迟函数
最后执行,多个的情况下,先定义的后执行,类似栈;多用于关闭
匿名函数
//匿名函数
f := func(a, b int) int {
return a + b
}
fmt.Println(f(1, 2))
fmt.Println(func(a, b int) int {
return a + b
}(3, 4))
回调函数
一个函数可以作为另一个函数的参数
func add(a, b int) int {
return a + b
}
func sub(a, b int) int {
return a - b
}
// 高阶函数,可以接受另一个函数作为参数
func op(a, b int, f func(c, d int) int) int {
return f(a, b)
}
func main() {
fmt.Println(op(3, 4, add))
fmt.Println(op(3, 4, sub))
}