golang中的函数,方法,接口,反射

golang语言代码简洁,编写简单,很大程度上是因为go提供给工程师的语言特性少。go中的功能封装是通过函数进行的,不同结构体之间可以通过接口来进行统一,再结合反射特性就可以开发大型复杂的项目

   函数

函数几乎是所有语言都提供的一种结构,但是go语言的函数有自己的特征,比如对闭包的支持,再如defer关键字的使用。

函数的定义,虽然go语言是支持面向对象编程的,但是函数才是go语言的基本组成元素,而实际上面向对象的用法在go语言里并不常见。

go语言的函数分为具名函数和匿名函数

func  Square(a int) int {
 return a*a
}

匿名函数
var  square = func (a int)int {
  return a*a 
}
fmr.Println(square(2))
匿名函数可以赋值给一个变量,也可以直接写在一个函数的内部

 func 内部先定义了一个函数var  r int,这个变量r因为没有显示的赋值,所有其作为int类型的默认值是0,然后func  double()()函数里面又定义了一个匿名函数,func () int{},这里是直接吧这个函数return回去的,在匿名函数里,先针对r进行自加操作,然后返回r*2,结果是2。

f  := double()接收了函数的返回值。即 func()int{}。说明匿名函数掌握了函数double定义的变量r,虽然这个r的定义在匿名函数的外面,从而跨过了作用域的限制,可以让r一直存在,这就是闭包,这个函数就是闭包函数。一个匿名函数引用了自身就是闭包。

在面向函数的编程中,大的功能往往会通过函数切分成多个独立的较小的功能,而且不可以定义太多全局变量,这就导致变量的作用域往往是包。打个比方,闭包在作用上类型面向对象编程中类的实例,他会吧函数和所访问的变量打包在一起,不在关心这个变量原来的作用域,闭包本省可以看做是独立对象。闭包函数与普通函数的最区别就是参数不是值传递而是引用传递,所以闭包函数可以操作自己函数以外的变量,结合前面介绍的垃圾回收机制来看,因为闭包函数对外部变量的操作才使其不能被释放回收,从而跨过了作用域的现实。

作用域

闭包可以上变量的作用域限制失效,但是如果对函数当中变量的作用域进行深入的分析,你会发现有些情况过度的使用闭包就会造成麻烦。

 定义了一个函数的切片,然后用一个for循环为切片增加了三个匿名函数,每个

匿名函数体内部都只有一个打印机语句,其作用是吧forx循环里面的变量i打印出来。

前文已经强调过,匿名函数使用外部变量用的是指针,并非值复制。在for循环里变量i是一个共享变量,每次循环一次都会吧原来存储的值加1。三次循环执行之后,i存储的就是3,第一种方式在函数执行的时候虽然打印了3次,也只是重复打印了三次3。而第二种当时在循环内每次执行的时候又声明了一个局部变量j,相当于每次都吧i不同的值存储下来,最终输出结果就是0,1,2

go语言里的局部变量名称和全局变量名称可以重复的,重复的时候,系统会默认把重名变量看做局部变量。所以 j :=  i  也可以写成 i := i  但是实际上没人这么写

方式三是方式二的简单变形,如果觉得单独增加一个变量会比较突兀,也可以通过改变函数的方式来增加形参,这样一来,不需要显式的写局部变量声明也可以达到。

闭包会将自己用到的变量都保存在内存中,导致变量无法被及时回收,并且可能通过闭包修改父函数使用的变量值。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>