事先声明:函数 / 方法
函数是独立的,没有绑定到某个类型的。方法是绑定在某个类型的函数
Go
func Sum(a int,b string)(data int,err error)
{
return //这里就等价于return data,err
}
这里的函数是最常见的函数,第一个小括号是形参列表,用于表示函数接收了什么参数,第二个小括号是返回值列表,作者在此处的做法是具名返回值,也就是说这个返回值不需要重新声明就可以使用,并且retrun的时候可以直接返回,不需要指定
函数可以最为参数传递给另一个函数,在此之前我们先搞懂函数类型
函数类型只包含函数的形参类型,返回值类型
Go
func Classify(score int, f func(int, int) (string, error)) {
for x := range score {
fmt.Println(f(x, x+1))
}
}
func Test(a int, b int) (string, error) {
return fmt.Sprintf("%d and %d", a, b), nil
}
func main() {
Classify(4, Test)
}
在上面的例子中,Classify函数的第二个形参就是一个函数类型,只要形参和返回值对的上,任何函数都可以作为形参传递
闭包,闭包的主要作用就是让函数记住他创建时外部变量,从而保存状态、延长变量生命周期、实现一定程度上的封装
函数内部的变量的生命周期仅限于当前函数。也就是说函数每次执行都会产生新的变量。通过闭包,可以让函数内变量持久化。当然,这个持久化其实并不是真的持久
Go
func Wai() func(string) string {
strs := ""
return func(str string) string {
strs += str
return strs
}
}
func main() {
c1 := Wai()
fmt.Println(c1("nihao\n"))
fmt.Println(c1("get it \n"))
}
当go检测到c1再也不会被使用的时候,就会释放strs的内存。
当c1被创建的时候,附带的有一个闭包空间,这个空间跟随c1的使用而存在,当c1不再被使用的时候,该空间就会释放,这个是go自己来判断的,不需要用户手动操作。所以就不会出现闭包多了内存不够的情况