从函数中的局部变量返回指针

2024-04-09

我正在读一本叫做《Go 编程语言》的书,在关于指针的第二章中写了以下内容

函数返回局部变量的地址是完全安全的。例如,在 在下面的代码中,由对 f 的特定调用创建的局部变量 v 即使是仍然存在 调用返回后,指针 p 仍将引用它:

var p = f()
func f() *int {
    v := 1
    return &v
}

我完全不明白这一点,局部变量应该在函数执行后被销毁。是因为可能 v 分配在堆上吗?我知道在 C 中,如果使用 malloc 分配空间,它在函数执行后不会被销毁,因为它位于堆上。


Go 不是 C。尽管有相似之处,但它的级别要高得多。它利用带有绿色线程调度程序和垃圾收集内存管理器的完整运行时。只要它有实时引用,它就永远不会收集内存。

Go 编译器包含一个称为“转义分析”的阶段,它会跟踪每个变量以查看它是否“转义”声明它的函数。任何可以逃逸的值都会在堆上分配并由垃圾收集进行管理;否则,它(通常)在堆栈上分配。

您可以找到有关该主题的更多信息:

  • https://blog.golang.org/ismmkeynote https://blog.golang.org/ismmkeynote
  • https://dave.cheney.net/2014/06/07/ Five-things-that-make-go-fast https://dave.cheney.net/2014/06/07/five-things-that-make-go-fast
  • https://dougrichardson.org/2016/01/23/go-memory-allocations.html https://dougrichardson.org/2016/01/23/go-memory-allocations.html
  • https://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html https://www.agardner.me/golang/garbage/collection/gc/escape/analysis/2015/10/18/go-escape-analysis.html
  • https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-escape-analysis.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从函数中的局部变量返回指针 的相关文章

  • 是否可以在 C/C++ 中模仿 Go 接口?

    在 Go 中 如果类型具有接口定义的所有方法 则可以将其分配给该接口变量 而无需显式继承它 是否可以在 C C 中模仿此功能 是的 您可以使用纯抽象类 并使用模板类来包装 实现 抽象类的类型 以便它们扩展抽象类 这是一个简单的示例 incl
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • 实现具有更广泛方法签名的接口

    在Go中 是否有一种方法可以使用方法来实现接口 其中实现中相应方法的返回类型 比 预期返回类型 更宽 这很难解释 所以这里有一个例子 在 Go Playground 中运行以下示例代码时出现此错误 prog go 36 14 cannot
  • 什么时候返回结构体指针是个好主意?

    我正在学习 Go 我对何时使用指针有点困惑 具体来说 当返回一个struct从函数中 什么时候适合返回结构体实例本身 什么时候适合返回指向结构体的指针 示例代码 type Car struct make string model strin
  • Doxygen:记录函数指针类型的参数 (ANSI-C)

    我的代码需要一些函数指针类型 例如 brief Callback function type foo typedef int foo int a int b 我想记录函数参数的语义 但是 param in out 旁边的 brief声明似乎
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • 当使用 k8s.io/client-go 库的 kubernetes 部署发生更改时获得通知的最佳方式是什么?

    Context 我正在编写一个使用k8s io client go https github com kubernetes client go 图书馆 这里是 godocs https godoc org k8s io client go
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • Go 编译器有窗口化设置选项吗?

    我正在使用 Go 6g 编译 GTK 应用程序 我想知道是否有编译器 链接器选项使其成为 Windows 可执行文件而不是控制台可执行文件 MinGW 有一个 mwindows 选项来实现此目的 目前我必须使用十六进制编辑器手动更改 PE
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 带 ref 参数的委托

    有没有办法在下面的代码中维护相同的功能 但不必创建委托 我正在与第 3 方 API 进行交互 其中包含许多不同的 DeleteSomethingX ref IntPtr ptr 方法 并且我正在尝试集中 IntPtr Zero 检查的代码
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何在 Go 中使用与包同名的变量名?

    文件或目录的常见变量名称是 path 不幸的是 这也是 Go 中包的名称 此外 在 DoIt 中更改路径作为参数名称 如何编译此代码 package main import path os func main DoIt file txt f
  • 结构体到磁盘的高效 Go 序列化

    我的任务是将 C 代码替换为 Go 而且我对 Go API 还很陌生 我正在使用 gob 将数百个键 值条目编码到磁盘页面 但 gob 编码有太多不需要的膨胀 package main import bytes encoding gob f
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 仅导出嵌入结构实现的方法子集

    是否可以仅导出嵌入结构实现的方法的子集 这是一种与减少代码复制和粘贴非常不同的方法吗 还有更惯用的方法吗 type A struct func a A Hello fmt Println Hello func a A World fmt P
  • []interface{}{} 中的双大括号是什么意思

    请注意 这是格式为 的双花括号 而不是嵌套花括号 我也不确定这是空接口问题 切片问题还是结构问题 我猜它至少是其中两个的组合 我正在学习 Golang 并且已经达到了空接口 我发现我需要将空接口声明为 interface 或者例如 inte

随机推荐

  • 有没有办法将 jq 输出到 bash 脚本的多个变量中?

    基本上我有一个 bash 脚本 它在某一时刻进行 API 调用 并生成证书和密钥并以 json 形式返回 我将其通过管道传输到 jq 并可以选择证书或密钥并将其存储在变量中 像这样的事情 CERT API call jq r certifi
  • Go 运行时错误:“分配给 nil 映射中的条目”

    我是 go lang 的新手 我正在尝试读取 csv 文件并收集数据 但运行后我得到了这个错误 panic assignment to entry in nil map goroutine 1 running panic 0x4dedc0
  • 登录 DBCP

    我正在使用 Apache Commons DBCP 有一个任务来跟踪 DBCP 的内部行为 活动和空闲连接的数量 我发现 DBCP 根本没有任何此类日志记录 是的 当从池中借用连接时 可以编写输出 BasicDataSource 状态的代码
  • 替换 JQueryUI 对话框的关闭图标

    经过对这个主题的广泛搜索后 我无法找到答案 所以希望有人可以帮助我解决这个问题 我有一个相对基本的对话框 dialog search dialog resizable false height dimensionData height wi
  • 使用掺杂向量访问多维数组的任意轴向切片?

    我正在构建一套功能来与多维数组数据结构 https stackoverflow com questions 30023867 how can i work with dynamically allocated arbitrary dimen
  • “enum class”是 C++ 中的类类型吗?

    我读到了 C 中的枚举声明 使用参考参数 http en cppreference com w cpp language enum 然后我做了枚举类并使用检查它是否是类类型std is class include
  • 有没有更简单的方法来访问 R 中类的属性,我可以使用点表示法吗?

    我在 R 中创建了一个包含多个属性的对象 我怎样才能轻松访问它们 我可以 attr x attributeName or attributes x attributeName 但它们都不是真正方便的 有没有更快的方法 如 C 或 Java
  • 无法让属性字符串在 Swift 中工作

    我试图在代码中设置字符串的一些属性 但无法得到NSAttributedString上班 这是应该更改字符串的函数 func getAttributedString string String gt NSAttributedString va
  • 实体框架代码首先迁移抛出错误

    这是我在收到此错误之前所做的操作 安装了 EF 预发布版本 可能是 6 我不知道 决定我不想要 所以卸载它并重新安装稳定版本 5 通过 SSMS 截断我的数据库 这是错误 Exception calling CreateInstanceFr
  • 使用 Spring MVC 应用程序实现 Tiles 3

    我正在尝试在 Spring MVC 应用程序中实现 Apache Tiles 3 因此我在 pom xml 文件中添加了以下依赖项
  • 对多索引 pandas 数据帧上的重复行求和

    你好 我在处理熊猫方面遇到了麻烦 我正在尝试对多索引数据帧上的重复行进行求和 我尝试过df groupby level 0 1 sum 还与df stack reset index groupby year product sum 和其他一
  • Typeorm .loadRelationCountAndMap 返回零

    请帮忙 我正在尝试执行以下 typeorm 查询 return await getRepository Company createQueryBuilder Company leftJoinAndSelect Company plants
  • 在另一个绘图的绘图区域内添加小直方图

    有没有办法在另一个图的绘图区域内添加直方图 但独立于 基础 图的坐标系 就我而言 我想将直方图作为图例添加到分区统计图 直方图将显示属于每个类别的区域数量 但问题可以轻松应用于任何绘图 例如 plot 1 10 rect 1 7 4 9 c
  • pandas DataFrame 中每一行的操作

    我想迭代 pandas DataFrame 中的每一行 并对每行中的元素执行一些操作 现在我有 for row in df iterrows if row col gt 1 5 doSomething 但它告诉我 元组索引必须是整数 而不是
  • 从 C# 打开 Google Chrome 的新窗口

    可以开新的instance来自 C 的 Chrome By instance我的意思是一个新的单独选项卡 不包含在现有的 Chrome 窗口中 我尝试过以下解决方案但是both他们创造了一个new tab in an existingchr
  • MongoDB - 返回插入项的 id

    从以下教程开始 https codeforgeek com 2015 08 restful api node mongodb https codeforgeek com 2015 08 restful api node mongodb 我有
  • MinGW GCC 通配符

    我在 Windows 上使用 MinGW GCC 编译器如何编译目录中的所有 C 文件 I used gcc c o Output 在我输入所需的文件夹后出现此错误 gcc error c Invalid argument gcc fata
  • 在 Julia 中迭代具有不同数量参数的不同函数

    我正在尝试使用不同数量的参数对不同的函数运行循环 变量是在运行时在循环内创建的 我想在每次迭代时使用 eval 来使用变量 symbol 实例化一个 Struct 但是 我不能这样做 因为 eval 只在全局范围内有效 这是有效案例的 MW
  • 当我尝试创建新模型时,Django 错误:名称“_”未定义

    我定义了这个模型 from django db import models from django db models import CharField Create your models here class City models M
  • 从函数中的局部变量返回指针

    我正在读一本叫做 Go 编程语言 的书 在关于指针的第二章中写了以下内容 函数返回局部变量的地址是完全安全的 例如 在 在下面的代码中 由对 f 的特定调用创建的局部变量 v 即使是仍然存在 调用返回后 指针 p 仍将引用它 var p f