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  但是实际上没人这么写

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三个目的:1.go语言的基础彻底讲明白,所以我们要100讲2.课程持续更新-随着go的新版本、新特性 持续更新3.我们的文档希望能成为go语言的查询文档 目标:让大家尽快完整的掌握go基础 尽快为什么尽快,因为我看到过很多人的半途而费,这里面有毅力的成分但是其实我更想说,市面上的培训千篇一律,大家都在变着花的讲基础,把一个简单的事情用各种各样的不常用的方式讲述出来我认为这会伤害一个人的学习的积极性学习有一个很重要的一条规则是: 尽快的得到正反馈所以前几十节,我只会告诉你最实用的东西,目标只有一个,让你可以思路清晰的先把go用起来,得到正反馈,激发你对他的热爱课时会保持在20分钟以内,如果你真想在地铁上学习,可以选择看一节  完整我们的基础课程之所以做100讲,就是要把go语言基础讲清楚 比如我,10年专注于开发、架构,前百度资深开发工程师现任某金融集团技术总监,丰富的开发经验,熟悉go、python开发语言我们每天都在用go解决各种各样的问题,我们深度使用了prometheus、生产环境深度使用了K8s、Docker等我们也致力于用go完成所有工作  go语言100讲之后的课程规划我们会用去go围绕go生态k8s、prometheus去围绕redis、kafka、nacos、ftp、elk等一系列工具我们的目标是用go完成我们所遇到的绝大部分工作,所以我们不写类似于聊天室这种项目我们是一群开发人员、运维人开发员组成的团队,有架构师、程序员、资深运维开发、DBA、应用运维、运维总监、网络工程师等,几乎包括了生态的各个方面因为我们想做我们专长的事情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值