匿名函数和闭包|Go主题月

简介: 什么是匿名函数?字面意义上说明就是没有被赋予名称的函数

网络异常,图片无法展示
|

匿名函数


什么是匿名函数?字面意义上说明就是没有被赋予名称的函数,举个例子:

package main
import (
  "fmt"
)
func main() {
    // 匿名函数定义方式1
  func (s string){
    fmt.Printf("匿名函数:%s\n",s)
  }("定义方式1")
    // 匿名函数定义方式2
  fn:=func (s string){
    fmt.Printf("匿名函数:%s\n",s)
  }
  fn("定义方式2")
}

闭包

闭包则实际上是一个函数的实例,也就是说它是存在于内存里的某个结构体。如果从实现上来看的话,匿名函数如果没有捕捉自由变量,那么它其实可以被实现为一个函数指针,或者直接内联到调用点,如果它捕捉了自由变量那么它将是一个闭包;

而闭包则意味着同时包括函数指针环境两个关键元素。在编译优化当中,没有捕捉自由变量的闭包可以被优化成普通函数,这样就无需分配闭包结构体,这种编译技巧被称为函数跃升

闭包=函数+引用环境

package main
import (
  "fmt"
)
func main() {
    // c拷贝闭包副本
  c:=Closure()
  c() // 调用闭包
  c() // 调用闭包
  // c2会拷贝新的闭包副本
  c2:=Closure()
  c2() // 调用闭包
}
/*
 闭包
*/
func Closure() func(){
  i:=1
  return func() {
    i++
    fmt.Printf("闭包,i=%d\n",i)
  }
}

输出:

闭包,i=2
闭包,i=3
闭包,i=2

逃逸分析

go语言能通过escape analyze识别出变量的作用域,自动将变量在堆上分配。将闭包环境变量在堆上分配是Go实现闭包的基础。

可以通过如下指令来分析上面的代码:

go build --gcflags=-m main.go

输出:

# command-line-arguments
./main.go:23:13: inlining call to fmt.Printf
./main.go:20:2: moved to heap: i
./main.go:21:9: func literal escapes to heap
./main.go:23:14: i escapes to heap
./main.go:23:13: []interface {}{...} does not escape
<autogenerated>:1: .this does not escape

可以看到**./main.go:23:14: i escapes to heap**,表明变量i已经逃逸到堆上了。

相关文章
|
11月前
|
Web App开发 Dart 监控
Golang+chromedp+goquery 简单爬取动态数据 |Go主题月
胖sir,最近一段时间正在使用golang来进行开发项目,慢慢的对golang有了一些了解,突然有一天,我想用golang来实现爬取网站上的数据,例如天气预报,每日一句等等,发现这些网站的数据都是javascript动态生成,苦恼呀,不知道如何才能把网站上的动态数据获取下来,为我所用呀,例如我抓取到动态数据之后发邮件给我哟
368 0
|
11月前
|
XML JSON 缓存
Gin实战演练|Go主题月
in实战 1 gin的简单使用
|
11月前
|
存储 JSON Go
|
11月前
|
存储 安全 编译器
|
11月前
|
移动开发 算法 编译器
OAUTH之钉钉第三方授权 | GO主题月
hello,我是小魔童哪吒,欢迎点击关注,有更新,将第一时间呈现到你的面前 胖sir:小魔童,我今天收到了一个需求,期望我们做一个第三方登录的功能,用户可以通过第三方授权来登录我们的web
268 0
|
11月前
|
Go Cloud Native
为什么要写技术文章 | GO主题月
这个问题对于每一个人来说各有各的原因。有的为了写作变现,有的为了自己的兴趣,写小说,写文章,写书。
为什么要写技术文章 | GO主题月
|
11月前
|
网络安全 Go Cloud Native
SSH连接服务器后执行多条命令 |Go主题月
大家平时有没有遇到自己连接云服务器,ssh 连接上去之后,发现自己的一些小工具用不了 例如go build无法使用 ,由于我们安装配置golang 环境的时候,是在文件/etc/profile中写了配置,因此需要source 一下/etc/profile
125 0
SSH连接服务器后执行多条命令 |Go主题月
|
11月前
|
Linux Go Windows
|
11月前
|
Go Windows Cloud Native
5个步骤搞定protoc环境安装 | GO主题月
[TOC] 胖sir:不知道你有没有这样的疑惑,工作中发现很多新接触GO的小伙伴安装protoc的环境需要折腾很久,刚才开我装环境的时候也是花了好长时间,最后如何装好的也不知原因,网上查找了各种资源,也没有一篇文章可以很好的解决这个问题.
1558 0
|
11月前
|
Go C语言 Cloud Native
GO基础知识分享2 | GO主题月
[TOC] 兵长:胖sir,咋还在看基础知识嘞?你以前可不是这样的哦 胖sir:切,我今天看的和之前的可不一样 兵长:有啥不一样的,你能给我说出花来嘛 胖sir:小样,你自己好好看看 兵长:看看就看看