Go几种内存逃逸的情况

news/2024/9/20 6:58:39/文章来源:https://www.cnblogs.com/qcy-blog/p/18415455

main.go

package mainimport "fmt"// 指针(任何类型的指针)、slice和map作为返回值
// 当带有指针的返回值被赋给外部变量或者作为参数传递给其他函数时, 编译器无法确定该变量何时停止使用
// 因此,为了确保安全性和正确性,它必须将该数据分配在堆上,并使其逃离当前函数作用域
func f1() (*int, []int, map[int]int) {i := 0list := []int{1, 2, 3, 4}mp := map[int]int{1: 1, 2: 2}return &i, list, mp
}// 向chan中发送数据的指针或者包含指针的值。会//编译器此时不知道值什么时候会被接收,因此只能放入堆中J
func f2() {i := 2ch := make(chan *int, 2)ch <- &i<-ch
}// 非直接的函数调用,比如在闭包中引用包外的值,因为闭包执行的生命周期可能会超过函数周期,因此需要放入堆中
func f3() func() {i := 1return func() {fmt.Println(i)}
}// 在slice或map中存储指针或者包含指针的值
// sLice和map都需要动态分配内存来保存数据。当我们将一个指针或包含指针的值放入sLice或map时,
// 编译器无法确定该指针所引用的数据是否会在函数返回庙仍然被使用
// 为了保证数据的有效性,编译器会将其分配到堆上,以便在函数返回后继续存在
func f4() {i := 1list := make([]*int, 10)list[0] = &i
}// interface类型多态的应用,可能会导致逃迎
// 由于按口类型可以持有任意实现了该按口的类型,编译器在编译时无法确定具体的动态类型
// 因此,为了保证程序正确性,在运行时需要将接口对象分配到堆上
func f5() {var a animal = dog{}a.run()var a1 animala1 = dog{}a1.run()
}// 由于fmt打印是interface类型
// 如果输出的内容包含指针或者channel,那么可能会发生内存泄露
func f6() {a := &dog{}fmt.Println(a)
}type animal interface {run()
}
type dog struct{}func (a dog) run() {}

执行 go build -gcflags '-m' main.go

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/797686.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

帝国CMS 多少数据分表好?已发布的数据怎么分表?

帝国CMS支持分表机制来提高数据库性能和管理大量数据。分表是一种将大量数据分散到多个表中的方法,这样可以减少单个表的大小,从而提高查询效率,特别是在大数据量的情况下。 多少数据分表好? 根据提供的信息,通常建议在数据量达到一定规模时进行分表。具体建议如下:5万条…

80岁老奶奶都可以看懂的Markdown操作指北【VScode版】

MARKDOWN从入门到入土 MARKDOWN是啥? 一个写作时候专注于内容,定稿时集中处理格式的高级world文档! 哈哈哈为什么用MARKDOWN? 当然是因为它好用啦 选择Markdown取决于你的具体需求和使用场景。如果你更注重内容创作、版本控制和跨平台兼容性,Markdown可能是更好的选择。 M…

帝国cms备份的数据库文件夹-帝国CMS备份中心

帝国CMS提供了内置的备份工具,称为“帝国备份王”,用于备份和恢复数据库。备份的数据库文件通常会被保存在一个特定的文件夹中。以下是关于帝国CMS备份的一些基本信息和备份文件夹的位置: 备份文件夹位置 帝国CMS备份的文件通常保存在网站根目录下的/data/backup/文件夹中。…

博客建站9 - hexo网站如何提升markdown文档的编辑效率和体验

1. 本网站的系统架构 2. 场景概述 3. 影响效率的问题和解决方案3.1. 图片插入-根据文章来分类管理3.1.1. 效率问题 3.1.2. 解决方案3.2. 图片插入-从剪贴板中插入图片3.2.1. 效率问题 3.2.2. 解决方案3.3. 图片插入-在VSCode中预览图片3.3.1. 效率问题 3.3.2. 解决方案3.4. 提交…

帝国cms配置数据库命令是什么

帝国CMS本身并不是通过命令行来配置数据库的,而是通过编辑配置文件来设置数据库连接信息。配置文件通常位于/e/config/config.php(对于帝国CMS 7.0及之后的版本)或/e/class/config.php(对于早期版本)。 在这些配置文件中,你需要手动编辑数据库连接参数。以下是配置文件中…

帝国CMS数据库数据表详细说明,每个表对应的数据功能说明

帝国CMS(EmpireCMS,简称ECMS)使用多个数据表来存储不同的信息。下面是一些常见的数据表及其功能说明:phome_ecms_news_doc_data:这是一个新闻归档数据副表,用于存储新闻的相关数据,如新闻的内容、作者等信息。phome_enewsad:广告数据表,用于存储广告信息,例如广告的图…

帝国CMS的多数据库配置

帝国CMS支持多数据库配置,这对于需要在同一个应用程序中处理多个数据源的情况非常有用。多数据库配置可以让你在一个帝国CMS项目中操作多个数据库,每个数据库可以有自己的配置信息。下面是关于如何配置帝国CMS以支持多数据库的一些建议:修改配置文件:配置文件通常位于/e/co…

帝国cms数据库在哪-帝国CMS

帝国CMS(EmpireCMS,简称ECMS)的数据库文件通常位于服务器上的某个特定目录内。根据提供的信息,帝国CMS数据库文件的位置大致如下:主数据库文件:empiremaker.sql:包含完整的数据结构。 empiremaker_add.sql:包含增补的数据结构。 empiremaker_config.sql:包含系统的配置…

Qml 实现星级评分组件 已发布

在现代应用程序中,星级评分是一个常见的用户界面元素,它允许用户对产品、服务或内容进行评价。 想必大家在用各种带有评分的软件中看到过这个组件: 本文将指导你如何使用 Qml 创建一个简单而美观的星级评分组件,并且支持高度自定义。【写在前面】 在现代应用程序中,星级评…

帝国cms配置数据库是什么

帝国CMS配置数据库涉及到对系统数据库连接参数的设置。为了正确配置帝国CMS以连接到数据库,你需要编辑配置文件中的相应部分。对于帝国CMS 7.0及之后的版本,数据库配置文件位于: /e/config/config.php在这个文件中,你需要设置以下几项:数据库名 (DBHOST):这是你的MySQL数…

开发nodejs RESETful api 创建项目流程

开发nodejs RESETful api 创建项目流程 1. 安装 vm-windows、node.js 和 npm 安装 Node.js 时, 建议使用版本管理器,因为版本变更速度非常快。 你可能需要根据所使用的不同项目的需要在多个 Node.js 版本之间进行切换。 Node 版本管理器(通常称为 nvm)是安装多个版本的 Nod…

帝国cms用的什么数据库

帝国CMS(EmpireCMS,简称ECMS)使用的是MySQL数据库来存储其数据。MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),因其高性能、稳定性和易用性而受到许多Web应用的青睐,包括内容管理系统(CMS)。 帝国CMS利用MySQL数据库来存储网站的各种数据,包括但不限于文章…