匿名函数和闭包|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已经逃逸到堆上了。

目录
相关文章
|
Web App开发 Dart 监控
Golang+chromedp+goquery 简单爬取动态数据 |Go主题月
胖sir,最近一段时间正在使用golang来进行开发项目,慢慢的对golang有了一些了解,突然有一天,我想用golang来实现爬取网站上的数据,例如天气预报,每日一句等等,发现这些网站的数据都是javascript动态生成,苦恼呀,不知道如何才能把网站上的动态数据获取下来,为我所用呀,例如我抓取到动态数据之后发邮件给我哟
505 0
|
XML JSON 缓存
Gin实战演练|Go主题月
in实战 1 gin的简单使用
|
XML JSON 算法
一看便会微信后台服务器开发 |Go主题月
就要下班了,兵长打开手机,看到弹出的某微信聊天机器人广告便点了进去,于是有了如下故事.
108 0
|
Go Cloud Native
为什么要写技术文章 | GO主题月
这个问题对于每一个人来说各有各的原因。有的为了写作变现,有的为了自己的兴趣,写小说,写文章,写书。
为什么要写技术文章 | GO主题月
|
网络安全 Go Cloud Native
SSH连接服务器后执行多条命令 |Go主题月
大家平时有没有遇到自己连接云服务器,ssh 连接上去之后,发现自己的一些小工具用不了 例如go build无法使用 ,由于我们安装配置golang 环境的时候,是在文件/etc/profile中写了配置,因此需要source 一下/etc/profile
169 0
SSH连接服务器后执行多条命令 |Go主题月
|
Go 知识图谱 Cloud Native
GO语言学习路线及资源分享 | GO主题月
go语言网站 如下为用到的资源网站,整理如下
GO语言学习路线及资源分享 | GO主题月
|
SQL 安全 关系型数据库
Go ORM 干啥的?|Go主题月
胖sir :接着,给你一个馅饼儿 兵长 : 来嘞!! 一篇来自ORM的整理笔记...
Go ORM 干啥的?|Go主题月
|
存储 JSON Go
|
存储 安全 编译器
|
移动开发 算法 编译器
OAUTH之钉钉第三方授权 | GO主题月
hello,我是小魔童哪吒,欢迎点击关注,有更新,将第一时间呈现到你的面前 胖sir:小魔童,我今天收到了一个需求,期望我们做一个第三方登录的功能,用户可以通过第三方授权来登录我们的web
323 0