Go语言中,将局部变量指针存入全局map是否安全?变量会留存至程序结束吗?
局部变量指针存入全局map后的生命周期解答
会的,代码中newOne对应的bigUnit实例会一直留存到程序运行结束,除非你主动从globalIndex中删除这个指针引用。
原因如下:
- Go语言的垃圾回收基于可达性分析逻辑:只要对象还被任何可达的引用持有,就不会被回收。
globalIndex是全局变量,在整个程序运行周期内都处于可达状态。当你把局部变量newOne的地址存入这个全局map后,map就持有了指向该bigUnit实例的引用,这个实例因此成为可达对象。- 只有当你从
globalIndex中删除对应的键值对(比如执行delete(globalIndex, id)),这个bigUnit实例才会失去唯一的可达引用,进而被垃圾回收器回收;否则它会一直存在直到程序退出。
补充说明:闭包能让局部变量指针安全使用,本质也是闭包环境持有了变量的引用使其保持可达;存入全局map是另一种维持对象可达性的方式,二者核心逻辑一致。
内容的提问来源于stack exchange,提问作者Tintervenor
相关产品推荐
相关产品推荐

