* 关键字func * 方法名字:首字母是否大写决定了作用域 * 参数列表:[<name type>] * 返回列表: [<name type>]
名字+参数列表+返回值,也叫做方法签名(signatrue)
Go的方法和别的语言比起来,有一个很大的不同:
带名字的返回值,就相当于你声明了一个作用域在整个方法的局部变量。
用不用带名字的返回值纯粹是个人风格,你看自己喜好。
方法调用只需要用足够的参数去接受返回值,并且传入了调用参数就可以。
有多个返回值的时候,如果你忽略一些返回值,可以使用 _
记住一条核心原则:同一个作用域内,如果左边出现了新的变量,那么就需要使用:=来接受返回值。
一个方法内部可以调用它自己,这就是所谓的递归
递归要小心,如果递归嵌套太深的话,可能会出现栈溢出错误。
方法本身就可以赋值给某个变量,而这个变量就可以直接发起调用。
下图中的myFunc3本质上是一个变量,只不过这个变量等于Func3
可以在方法内部声明一个局部方法,它的作用域就在本方法内
方法可以作为返回值
注意,不是方法的返回值,是方法本身就可以作为返回值
后面你们经常会看到我的这种用法,它本身也是闭包的一种应用
右图中的sayhello就是返回来的那个方法,所以可以直接调用
在前面你已经见过声明一个匿名方法,然后赋值给一个变量
那么你也可以声明一个匿名方法,而后可以立刻发起调用
右图中hello就是匿名函数直接发起调用之后返回的数据
这种用法在defer中用的多。
闭包,方法+它绑定的运行上下文
图返回的是闭包,它由两部分构成:
闭包也是一个面试redden,所以你至少需要记住闭包的定义。
闭包如果使用不当可能会引起内存泄漏的问题。即一个对象被闭包引用的话,它是不会被垃圾回收的。
记住这个结论,后面面试用得上。
GO支持不定参数。不定参数是指最后一个参数,可以传入任意多个值
注意必须是最后一个参数才可以声明为不定参数
不定参数在方法内部可以被当成切片来使用。
Option模式大量应用来不定参数。
Go里面有一个机制,允许你从方法返回的前一刻,执行一段逻辑
这个也就是defer,也叫做延迟调用
defer类似栈,也就是后进先出。也就是,先定义的后执行;后定义的先执行。
图中我们利用匿名函数定义了两个defer
图中的这种写法:叫做匿名函数的立刻发现调用。
我们通常都用闭包来写defer,所以就会涉及到一个问题,就是defer执行的时候怎么确定里面的值?
输出:1
确定值的原则:
如果是带名字的返回值,那么可以修改这个返回值,否则不能修改。
注意:最右边的并没有修改a,而是修改a指向的结构体
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!