1.go函数声明语法:func 函数名 (参数列表) (返回值列表){}
func add()(){
}
2.golang函数特点
(1)不支持重载:一个包中不能有两个函数名称一样的函数,即使参数列表不同
(2)多返回值
(3)匿名函数
(4)函数是一种类型,也可以赋值给一个变量
(5)函数名大小写敏感,函数名首字母表示该函数可跨包调用,小写表示不可跨包调用
package main
import (
"fmt"
)
type op_func func(int, int) int
//多返回值的例子
func Calc(a int, b int) (int, int) {
sum := a + b
avg := (a + b) / 2
return sum, avg
}
func add(a, b int) int {
return a + b
}
func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a + b) / 2
return
}
func operator(op op_func, a, b int) int {
return op(a, b)
}
//可变参函数例子,第一个参数固定,从第二个开始是可变参
func add1(a int, arg ...int) int {
var sum int = a
for i := 0; i < len(arg); i++ {
sum += arg[i]
}
return sum
}
func main() {
c := add(100, 200)
fmt.Println(c)
var d op_func
d = add
fmt.Println(add)
fmt.Println(d)
//函数赋值例子,类似于c语言函数指针的使用方法
sum := operator(d, 100, 200)
fmt.Println(sum)
//注意顺序不能反
sum1, avg1 := calc(10, 20)
fmt.Println("sum1: ", sum1, ", avg1: ", avg1)
sum2 := add1(10, 3, 3, 3, 3)
fmt.Println("sum2: ", sum2)
}
3.defer关键字
go语言中的defer关键字表示延迟执行,在函数结束时执行,因此可以在defer中做一些关闭文件描述符,资源释放,断开数据库连接等操作。
(1)defer的执行时机:defer语句在函数返回之前 或者 函数中 return语句(return语句可能调用另一个函数) 之后执行。例子:
package main
import (
"fmt"
)
func main() {
fmt.Println(deferReturn())
}
func deferReturn() (ret int) {
defer func() {
ret++
}()
return 10
}
输出结果是:11,原因是defer在return之后执行,对返回值ret的值10执行+1操作
(2)多个defer语句的执行顺序是先进后出
package main
import (
"fmt"
)
func deferMulti() {
for i := 0; i < 5; i++ {
defer fmt.Printf("%d ", i)
}
}
func main() {
deferMulti()
}
输出结果:4 3 2 1 0
4._标识符,用来忽略函数返回值
package main
import (
"fmt"
)
func calc(a, b int) (sum int, avg int) {
sum = a + b
avg = (a + b) / 2
return
}
func main() {
sum, _ := calc(10, 20)
fmt.Println(sum)
}
输出结果:30