函数的基本写法
func add(a int, b int) int { return a + b }
如果2个参数的类型一样,可以简写为
func add(a, b int) int { return a + b }
多个返回值
func add_substract(a int, b int) (int, int) { return a + b, a - b }
忽略多个返回值中的某一个
func add_substract(a, b int) (int, int) { return a + b, a - b } n1, _ := add_substract(3, 4)
定义函数类型
func add(a int, b int) int { return a + b } func sub(a, b int) int { return a - b } type Cal func(int, int) int func do(f Cal, a, b int) int { return f(a, b) } func main() {
n1 := do(add, 3, 5) n2 := do(sub, 5, 3)
fmt.Println("n1 =", n1) fmt.Println("n2 =", n2) }
不定参数的场景
不定参数函数的形参可以为不定参数,或者为切片。
但是这是2种不同的函数类型。
func get_sum(data ...int) { sum := 0 for _, v := range data { sum += v } fmt.Println(sum) return } func main() { fmt.Println("Hello World!") get_sum(1, 2, 3) slice := make([]int, 3) slice[0] = 1 slice[1] = 2 get_sum(slice...) }
运行结果
Hello World! 6 3 成功: 进程退出代码 0.
defer函数
defer函数的主要作用为了保证资源的回收和释放。
当defer函数放在return之后时,不会被执行。
当defer函数所在的程序调用了os.Exit(),不管是Exit(0),Exit(1),defer都不会被执行。
defer函数后面的()里面是为了放实参的。
func main() { fmt.Println("Hello World!") defer func(x int) { fmt.Println("defer x=", x) }(1) fmt.Println("test end") // os.Exit(0) os.Exit(1) }
运行结果
Hello World! test end exit status 1 错误: 进程退出代码 1.
多个defer函数放在一起,最后的defer先执行。(defer充分贯彻落实FILO)