函数的定义
函数的结构
func [function name] (paramters , ...) (return type) {
}
//func add(a int , b int)
func add(a, b int) int { //代表两个变量是一样的类型
return a + b
}
func swap(a , b int) (int int) {
return b ,a
}
//匿名函数
func main{
f := func(a,b int){
return a + b
}
fmt.Printf(f(2.3))
}
闭包的概念
闭包表示的是一个函数可以使用另一函数的内部的变量,也可以理解为定义在函数里面的函数.
百度百科:
闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
我个人认为,理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象,这就是闭包的重要概念。
产生一个闭包
创建闭包最常见方式,就是在一个函数内部创建另一个函数。下面例子中的 closure 就是一个闭包:
闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域。
闭包的注意事项
.通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。但是,在创建了一个闭包以后,这个函数的作用域就会一直保存到闭包不存在为止。
从上述代码可以看到add5 和 add10 都是闭包。它们共享相同的函数定义,但是保存了不同的环境。在 add5 的环境中,x 为 5。而在 add10 中,x 则为 10。最后通过 null 释放了 add5 和 add10 对闭包的引用。
在javascript中,如果一个对象不再被引用,那么这个对象就会被垃圾回收机制回收;
如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
闭包只能取得包含函数中的任何变量的最后一个值
内存泄漏
闭包会引用包含函数的整个变量对象,如果闭包的作用域链中保存着一个HTML元素,那么就意味着该元素无法被销毁。所以我们有必要在对这个元素操作完之后主动销毁。
Go里面还有一个概念就是方法
方法我的理解就是一个对象里面的函数,就叫做某个对象的方法。然后这个对象是我们需要指定给这个函数的简单的举个例子
type user struct{
var size int
var name string
}
func (u user) notify() {
fmt.Printf("size is ",u.size, "name is " ,u.name)
}
func main(){
user a = {10,"hello"};
a.notify();
}