函数
1. 与其他编程语言的区别(timeSpender)
- 可以有多个返回值
- 所有参数都是值传递:slice、map、channel
- 函数可以作为变量的值(函数式编程 js)
- 函数可以作为参数和返回值
小例子:
把一个无参数,无返回值的函数进行包装,包装成计时函数,可以打印消耗的时间
import (
"fmt"
"time"
)
func sleepSecond() {
time.Sleep(time.Second * 3)
}
// 包装器
func getTimeCost(fn func()) func() {
return func() {
start := time.Now()
fn()
fmt.Println(time.Since(start).Seconds())
}
}
func main() {
fmt.Println("start")
// 由包装器返回的新函数
timeFn := getTimeCost(sleepSecond)
timeFn()
}
输出
start
3.0002455
2. 可变长参数
func Sum(ops ...int) int {
var res int = 0
for _, op := range ops {
res += op
}
return res
}
func main() {
fmt.Println(Sum(1, 2, 3, 4))
fmt.Println(Sum(1, 2, 3, 4, 5))
}
3. Defer
延迟执行,在函数抛出异常、返回值之前执行,一般用于清理内存,释放资源、锁
func Clear() {
fmt.Println("clear all")
}
func testDefer() int {
defer Clear()
return 10
// panic("err")
}
func main() {
fmt.Println(testDefer())
}
输出:
clear all
10