package main
import (
"fmt"
"strings"
)
func funcA() {
fmt.Println("funcA")
}
func funcB() {
//revover 必须和defer搭配使用。 defer必须在可能引发panic的语句之前定义
defer func() {
err := recover()
if err != nil {
fmt.Println("recover in B")
}
}()
defer func() {
fmt.Println("释放数据库链接")
}()
panic("出错了,出现了严重的错误!!!")
fmt.Println("funcB")
}
func funcC() {
fmt.Println("funcC")
}
func makeSuffixFunc(suffix string) func(string) string {
return func(name string) string {
if !strings.HasSuffix(name, suffix) {
return name + suffix
}
return name
}
}
//闭包是个函数,能包含它外部作用域的一个变量
//底层原理 1 函数可以作为返回值 2 函数内部查找变量的顺序,现在自己内部找,找不到往外层找
func adder(x int) func(int) int {
return func(y int) int {
x += y
return x
}
}
func main() {
ret := adder(100)
fmt.Println(ret(200))
ms := makeSuffixFunc(".jpg")
fmt.Println(ms("test"))
fmt.Println(ms("abc.jpg"))
f1, f2 := cal(10)
fmt.Println(f1(1), f2(2))
fmt.Println(f1(3), f2(4))
fmt.Println(f1(5), f2(6))
//go语言中的内置函数
// close channel... len(sring,array,slice,map channel)....new(分配内存,int struct,指针) . make 分配内存返回引用类型。 append(压倒数组,slice。 。。。。。panic。recover
//每一种错误都是一种具体的值。
funcA()
funcB()
funcC()
}
func cal(base int) (func(int) int, func(int) int) {
addr := func(i int) int {
base += i
return base
}
sub := func(i int) int {
base -= i
return base
}
return addr, sub
}