Go 闭包在内存中是如何布局的?

2023-11-27

有关闭包的一般解释,请参见JavaScript 闭包如何工作?

Go 闭包到底是如何在内存中布局的?

以以下函数为例:

type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}

当我们的代码调用a := m.Adder(),堆上分配了多少内存以及它是什么样的?返回多少内存func()值占用(无论它最终在内存中的什么位置)?


Go 编程语言 规格

函数字面量

函数字面量表示匿名函数。

FunctionLit = "func" Signature FunctionBody .

func(a, b int, z float64) bool { return a*b < int(z) }

函数文字可以分配给变量或直接调用。

f := func(x, y int) int { return x + y }
func(ch chan int) { ch <- ACK }(replyChan)

函数字面量是闭包:它们可以引用定义在 周围的函数。然后这些变量在 围绕函数和函数文字,它们作为 只要它们可以访问。


闭包可以引用定义在 周围的函数。然后这些变量在 围绕函数和函数文字,它们作为 只要它们可以访问。

在函数调用中幸存下来的变量被放置在堆上。在 Go 中,闭包确实就是这么简单。


例如,

func closure() func() *byte {
    var b [4 * 1024]byte
    return func() *byte {
        return &b[0]
    }
}

A closure()call 是两次堆分配,一次分配 16 (= 8 + 8 on amd64) 字节

struct { F uintptr; b *[4096]byte }

一个为 4096 字节

[4096]byte

总共 4112 字节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 闭包在内存中是如何布局的? 的相关文章

  • 为什么使用闭包进行赋值而不是直接将值赋给键?

    我当时正在看在 7 10 他添加了一个数据库依赖项并使用闭包来分配值 我的问题是为什么不直接使用直接赋值 我的意思是不这样做 container db capsule 相当于这样做 container db function contain
  • 在 Golang 中运行外部 python,捕获连续的 exec.Command Stdout

    所以我的 go 脚本将像这样调用外部 python cmd exec Command python game py cmd Stdout os Stdout cmd Stderr os Stderr go func err cmd Run
  • 如何将所有GET请求查询参数放入Go中的结构体中?

    你好 我想将 get 查询参数转换为 Go 中的结构 例如我有这样的结构 type Filter struct Offset int64 json offset Limit int64 json limit SortBy string js
  • Javascript 闭包 - 变量范围问题

    我正在阅读 Mozilla 开发者网站上有关闭包的内容 我注意到在他们的常见错误示例中 他们有以下代码 p Helpful notes will appear here p p E mail p
  • Golang 结构体初始化

    有一个像这样的简单结构 type Event struct Id int Name string 这两种初始化方法有什么区别呢 e1 Event Id 1 Name event 1 e2 Event Id 2 Name event 2 为什
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • json.Unmarshal json字符串到对象是空结果[重复]

    这个问题在这里已经有答案了 我有一个非常简单的程序 如下所示 package main import encoding json fmt type RunCommand struct level string json level call
  • 如何拥有在标准输出上更新的就地字符串

    我想输出到标准输出并让输出 覆盖 以前的输出 例如 如果我输出On 1 10 我想要下一个输出On 2 10覆盖On 1 10 我怎样才能做到这一点 stdout是一个流 io Writer 您无法修改已写入其中的内容 什么can更改的是该
  • 为什么我不能在 Javascript 中滚动循环?

    我正在开发一个使用 dojo 的网页 并且上面有许多 在我的测试用例中为 6 但通常是可变的 项目小部件 我正在调用 dojo addOnLoad init 并且在 init 函数中我有以下几行 dojo connect dijit byI
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • golang中如何将相对路径解析为绝对路径?

    节点中是否有类似 path resolve 的API 或者有什么东西可以做同样的事情 例如 nodejs代码 path resolve sample sh 应该得到 home currentuser sample sh 解决 表示用户主目录
  • Scala 匿名函数中的 return 语句

    为什么显式 return 语句 使用return关键字 在匿名函数中从封闭的命名函数返回 而不仅仅是从匿名函数本身返回 例如 以下程序会导致类型错误 def foo String x Integer gt return x foo 我知道建
  • javascript 闭包和对象引用

    我的情况有点晦涩难懂 主要是因为我认为我已经掌握了闭包 所以基本上我想要的是将集合重置为默认值 假设我有一个集合 它具有带有对象参数数组的构造函数 var c new collection x y z 然后集合定期更新 因为我没有保留数组的
  • 如何在 Go 中使用与包同名的变量名?

    文件或目录的常见变量名称是 path 不幸的是 这也是 Go 中包的名称 此外 在 DoIt 中更改路径作为参数名称 如何编译此代码 package main import path os func main DoIt file txt f
  • pq:函数unnest(未知)不是唯一的

    以下代码工作正常 但我想将 array a b c d e 定义为变量 rows err db Query select colname from SELECT date unnest array a b c d e AS colname
  • Golang 结构的 XML 和 JSON 标签?

    我有一个可以根据 HTTP 请求标头输出为 JSON 或 XML 的应用程序 我可以通过将正确的标签添加到我正在使用的结构中来实现正确的输出 但我不知道如何为 JSON 和 XML 指定标签 例如 序列化以纠正 XML type Foo s

随机推荐

  • OSX 崩溃时自动重新启动程序[重复]

    这个问题在这里已经有答案了 可能的重复 如何编写 bash 脚本来在进程终止时重新启动该进程 我编写了一个偶尔崩溃的 C 程序 但我无法修复它 getaddrinfo 的一些问题看起来相当自发 我想在崩溃时重新启动程序 我以为这很容易 我打
  • React.js“从somelib导入{Something}”和“从somelib导入某些东西”之间的区别[重复]

    这个问题在这里已经有答案了 我不明白以下之间的区别 import Something from somelib and import Something from somelib 在 React js 中 有人可以解释一下吗 使用 ES6
  • 如何从实际计算机访问虚拟机上的django开发服务器

    好的 我的笔记本电脑已经安装了 vmware 播放器 我正在将 lubuntu 作为虚拟机运行 并且在虚拟机上安装了 django 并正在测试我的应用程序 因此我执行了 python manage py runserver 并且我可以通过从
  • 如何使用 Bootstrap 4 实现响应式排版?

    我正在使用 Bootstrap 4 构建响应式 Web 应用程序 与桌面相比 我希望在移动设备上减小所有文本的字体大小 因此我根据 Bootstrap 文档将以下内容添加到我的基本 css 文件中 https getbootstrap co
  • c3p0 连接池是否确保最大池大小?

    我已经经历了几个问题 this有些相关 但没有回答我的问题 c3p0 是否有连接池maxPoolSize确保某个时间的连接数永远不会超过这个限制 如果maxPoolSize 5并且 10 个用户同时开始使用该应用程序 我的应用程序 配置
  • iText:如何在同一文档中插入背景图像以刷新响应

    我正在创建一个 PDF 并编写流作为响应 在写入流之前 我想在所有页面中添加背景图像作为水印 以便通过响应刷新的 PDF 文档是最后一个带水印的文档 嗨 这是我的代码示例 任何帮助将非常感激 private static String ge
  • 使用 Javascript 检测 Flash 应用程序是否正确加载?

    我的产品打开一个 Web 浏览器并将其指向包含本地 Flash 应用程序的 HTML 文件 如何以编程方式检测该文件是否加载成功 如果没有成功则抛出什么异常 有没有办法使用 JavaScript 来做到这一点 从外部检查文件是否存在于磁盘上
  • 用于获取日期的星期几的确定性标量函数

    SQL Server 尝试通过确定性 UDF 获取星期几 我确信这一定是可能的 但无法弄清楚 更新 示例代码 CREATE VIEW V Stuff WITH SCHEMABINDING AS SELECT MD ID MD DateTim
  • Android ImageAdapter 与 Fragment 中的 Gridview

    我有一个带有 gridview 的适配器 它作为一个 Activity 工作 我现在尝试将其放入片段中并转换内容 但它不起作用 当我在 Activity 中包含 IconFragmentSystem 时 当我尝试打开 Activity 时
  • spawnSync /bin/sh ENOBUFS

    Error spawnSync bin sh ENOBUFS 在执行以下行时 非系统地在我的 NodeJs 应用程序中生成 child process execSync cd tmp myFolder tar xjf myArchive t
  • 发送到应用程序的 CTRL-C 单元测试

    I am developing an application handling CTRL C I am producing a signal handler to shut down gracefully threads and other
  • Google Play 内容政策 [关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚收到一封来自 Google 的电子邮件 告诉我我的一个应用违反了开发者条款 我有 7 天的时间来遵守 他们是这么说的 警告原因 违反内容的垃圾邮件规定 政策 请勿发布重复内容 产品描述不应
  • 查找数组中出现次数最多的元素 [java]

    我必须找到双精度数组中出现次数最多的元素 我是这样做的 int max 0 for int i 0 i lt array length i int count 0 for int j 0 j lt array length j if arr
  • 如何将 Swift 对象序列化或转换为 JSON?

    下面这个类 class User NSManagedObject NSManaged var id Int NSManaged var name String 需要转换为 id 98 name Jon Doe 我尝试手动将对象传递给函数 该
  • 使用 HTTP Post 从客户端流式传输数据

    我想将数据从客户端流式传输到服务器 我的应用程序将音频数据流式传输到服务器 当我开始流式传输时 我不知道音频会持续多长时间 我想通过在记录数据时传输数据来减少延迟 一旦所有数据上传完毕 我就会对其进行处理 所以 我想要的是一个 HTTP P
  • 如何在 UWP 应用中保留 TextBlock 的空白

    如果您只是将 TextBlock 中的 Text 属性的值设置为 例子 请注意 此处有 3 个空格end这个字符串 TextBlock 在 UI 中显示的只是 Example 并且在网上搜索解决方案后 发现有一种方法可以解决这个问题
  • 如何用 C++ 读取和解析 CSV 文件?

    我需要在 C 中加载和使用 CSV 文件数据 此时它实际上可以只是一个逗号分隔的解析器 即不用担心转义新行和逗号 主要需要是一个逐行解析器 每次调用该方法时 它将返回下一行的向量 我发现这篇文章看起来很有前途 http www boost
  • javascript,在开始颜色和结束颜色之间选择一个随机的十六进制颜色

    有什么快速的方法可以实现这一点吗 例如 起始颜色 EEEEEE 和结束颜色 FFFFFF 会产生类似 FEFFEE 的颜色 当然 十六进制被编码为数字 但要使其有意义 您必须首先提取 rgb 组件 function rgb string r
  • php邮件的smtp配置

    我使用 php 邮件功能从我的网站发送邮件 但现在它不起作用 我联系了我们的托管团队 然后他们告诉我使用 smtp 因为他们对服务器做了一些更改 我不知道该怎么做 当前代码 带有 php 邮件功能 如下 任何人都可以帮助我进行与此相关的更改
  • Go 闭包在内存中是如何布局的?

    有关闭包的一般解释 请参见JavaScript 闭包如何工作 Go 闭包到底是如何在内存中布局的 以以下函数为例 type M int func m M Adder amount int func return func m m amoun