编辑
2024-05-31
🧰语言-go
00
请注意,本文编写于 445 天前,最后修改于 285 天前,其中某些信息可能已经过时。

目录

方法声明
方法声明:返回值
方法调用
方法调用:递归
函数式编程入门:方法做为变量
函数式编程入门:局部方法
函数式编程入门:方法作为返回值
函数式编程入门:匿名方法发起调用
函数式编程入门:闭包
不定参数
defer
defer 与闭包
defer修改返回值

方法声明

  • 四个部分
* 关键字func * 方法名字:首字母是否大写决定了作用域 * 参数列表:[<name type>] * 返回列表: [<name type>]

名字+参数列表+返回值,也叫做方法签名(signatrue)

image.png

方法声明:返回值

Go的方法和别的语言比起来,有一个很大的不同:

  • 可以有很多个返回值,并且返回值可以有名字

带名字的返回值,就相当于你声明了一个作用域在整个方法的局部变量。

用不用带名字的返回值纯粹是个人风格,你看自己喜好。

image.png

方法调用

方法调用只需要用足够的参数去接受返回值,并且传入了调用参数就可以。

有多个返回值的时候,如果你忽略一些返回值,可以使用 _

记住一条核心原则:同一个作用域内,如果左边出现了新的变量,那么就需要使用:=来接受返回值。

image.png

方法调用:递归

一个方法内部可以调用它自己,这就是所谓的递归

递归要小心,如果递归嵌套太深的话,可能会出现栈溢出错误。

  • 治标的话,栈溢出可以考虑通过增加栈大小来解决
  • 治本的话,还是要找到对应的递归代码,进行修改。

image.png

函数式编程入门:方法做为变量

方法本身就可以赋值给某个变量,而这个变量就可以直接发起调用。

下图中的myFunc3本质上是一个变量,只不过这个变量等于Func3

image.png

函数式编程入门:局部方法

可以在方法内部声明一个局部方法,它的作用域就在本方法内

image.png

函数式编程入门:方法作为返回值

方法可以作为返回值

注意,不是方法的返回值,是方法本身就可以作为返回值

后面你们经常会看到我的这种用法,它本身也是闭包的一种应用

右图中的sayhello就是返回来的那个方法,所以可以直接调用

image.png

函数式编程入门:匿名方法发起调用

在前面你已经见过声明一个匿名方法,然后赋值给一个变量

那么你也可以声明一个匿名方法,而后可以立刻发起调用

右图中hello就是匿名函数直接发起调用之后返回的数据

这种用法在defer中用的多。

image.png

函数式编程入门:闭包

闭包,方法+它绑定的运行上下文

图返回的是闭包,它由两部分构成:

  • 方法
  • 运行时上下文:它只引用啦name这一个变量

闭包也是一个面试redden,所以你至少需要记住闭包的定义。

闭包如果使用不当可能会引起内存泄漏的问题。即一个对象被闭包引用的话,它是不会被垃圾回收的。

记住这个结论,后面面试用得上。

image.png

不定参数

GO支持不定参数。不定参数是指最后一个参数,可以传入任意多个值

注意必须是最后一个参数才可以声明为不定参数

不定参数在方法内部可以被当成切片来使用。

Option模式大量应用来不定参数。

image.png

defer

Go里面有一个机制,允许你从方法返回的前一刻,执行一段逻辑

这个也就是defer,也叫做延迟调用

defer类似栈,也就是后进先出。也就是,先定义的后执行;后定义的先执行。

图中我们利用匿名函数定义了两个defer

image.png

图中的这种写法:叫做匿名函数的立刻发现调用。

image.png

defer 与闭包

我们通常都用闭包来写defer,所以就会涉及到一个问题,就是defer执行的时候怎么确定里面的值?

image.png 输出:1

确定值的原则:

  • 作为参数传入的:定义defer的时候就确定来。
  • 作为闭包引入的:执行defer对应的方法时候才确定

image.png

defer修改返回值

如果是带名字的返回值,那么可以修改这个返回值,否则不能修改。

image.png

image.png 注意:最右边的并没有修改a,而是修改a指向的结构体

本文作者:Eric

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!