Go中不常见的语法——方法表达式,方法值和函数闭包

572 阅读2分钟

方法表达式

方法表达式(method expression)这种方式也能实现函数的调用。

  • 方法复制给一个变量,然后执行这个变量(变量其实就是方法,是function value,如图中的:f)。
  • *结构体.方法名(对象地址,方法参数) receiver是第一个参数,显式传参。

image.png

方法值

方法值(method value)赋值给一个变量时,会立刻保持此时的receiver对象的值与其绑定(如果是指针,则会保存此时指针的地址,到时候实际执行的时候,就会获取最新指针指向的地址的值运算,得到的就都是最终结果'mzy3333')。在后面执行的时候,可以隐式使用到这个receiver对象。

image.png

上图,虽然getName1,getName2,getName3,getName4是在最后执行的,但是他们都保留了在当时被赋值时候运算所应该得到的结果。

闭包

前提需要了解

  • golang中每个函数都有一个function value类型的指针指向改函数的入口地址。
  • 闭包定义:
    1.有函数外部定义,函数内部被引用的对象。
    2.即使脱离了上下文,闭包函数也能照常运行。 -闭包函数执行的时候,才会去捕获所需要的外部变量。

场景1,被捕获的变量除了初始化赋值外,没有任何修改

最简单的场景,需要使用的时候直接拷贝值到捕获列表即可。

image.png

每次执行重新捕获 image.png

场景2. 被捕获的变量除了赋值外,也做了修改

编辑器会把栈上的变量拷贝一份到堆上,包内和包外都使用堆上的变量(为了确保包外和包内使用参数的一致性)

image.png

这个闭包问题比较复杂,我是参考这个视频的讲解一起理解的。 【Golang】是闭包啊..._哔哩哔哩_bilibili


本文正在参加技术专题18期-聊聊Go语言框架