4 go的函数

函数的定义

函数的结构

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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章