方法表达式
方法表达式(method expression)这种方式也能实现函数的调用。
- 方法复制给一个变量,然后执行这个变量(变量其实就是方法,是function value,如图中的:f)。
- *结构体.方法名(对象地址,方法参数) receiver是第一个参数,显式传参。
方法值
方法值(method value)赋值给一个变量时,会立刻保持此时的receiver对象的值与其绑定(如果是指针,则会保存此时指针的地址,到时候实际执行的时候,就会获取最新指针指向的地址的值运算,得到的就都是最终结果'mzy3333')。在后面执行的时候,可以隐式使用到这个receiver对象。
上图,虽然getName1,getName2,getName3,getName4是在最后执行的,但是他们都保留了在当时被赋值时候运算所应该得到的结果。
闭包
前提需要了解
- golang中每个函数都有一个function value类型的指针指向改函数的入口地址。
- 闭包定义:
1.有函数外部定义,函数内部被引用的对象。
2.即使脱离了上下文,闭包函数也能照常运行。 -闭包函数执行的时候,才会去捕获所需要的外部变量。
场景1,被捕获的变量除了初始化赋值外,没有任何修改
最简单的场景,需要使用的时候直接拷贝值到捕获列表即可。
每次执行重新捕获
场景2. 被捕获的变量除了赋值外,也做了修改
编辑器会把栈上的变量拷贝一份到堆上,包内和包外都使用堆上的变量(为了确保包外和包内使用参数的一致性)
这个闭包问题比较复杂,我是参考这个视频的讲解一起理解的。 【Golang】是闭包啊..._哔哩哔哩_bilibili
本文正在参加技术专题18期-聊聊Go语言框架