当前位置: 首页 > wzjs >正文

tag做的最好的网站北京网络营销推广培训哪家好

tag做的最好的网站,北京网络营销推广培训哪家好,网站建设体会,php+mysql+dreamweaver网站建设全程揭秘在 Go 语言中,“弱指针”指的是不会阻止垃圾回收器(GC)回收目标对象的引用。 当一个对象只剩弱指针指向它,而没有任何强引用时,GC 仍会把该对象当作不可达对象并回收;随后,所有指向它的弱指针会…

在 Go 语言中,“弱指针”指的是不会阻止垃圾回收器(GC)回收目标对象的引用

当一个对象只剩弱指针指向它,而没有任何强引用时,GC 仍会把该对象当作不可达对象并回收;随后,所有指向它的弱指针会自动变为 nil

简而言之,弱指针不会增加对象的引用计数。当一个对象只被弱指针引用时,垃圾回收器就可以释放它。因此,在尝试使用弱指针的值之前,应检查它是否为 nil

Go 1.24 中的 weak 包

Go 1.24 新增 weak 包,提供了创建和使用弱指针的简洁 API。

import "weak"type MyStruct struct {Data string
}func main() {obj := &MyStruct{Data: "example"}wp := weak.Make(obj) // 创建弱指针val := wp.Value()    // 获取强引用或 nilif val != nil {fmt.Println(val.Data)} else {fmt.Println("对象已被垃圾回收")}
}

在以上示例中,weak.Make(obj) 创建了指向 obj 的弱指针。调用 wp.Value() 时,如果对象仍存活则返回强引用,否则返回 nil

测试弱指针

import ("fmt""runtime""weak"
)type MyStruct struct {Data string
}func main() {obj := &MyStruct{Data: "test"}wp := weak.Make(obj)obj = nil // 移除强引用runtime.GC()if wp.Value() == nil {fmt.Println("对象已被垃圾回收")} else {fmt.Println("对象仍然存活")}
}

通过将强引用 obj 置为 nil 并主动触发 GC,可观察到弱指针在对象被回收后返回 nil 的行为。

弱指针”与“强引用”的区别:

特性强引用 (*T)弱引用 (weak.Pointer[T])
影响 GC会保持对象存活不会保持对象存活
空值nilnil(目标被回收或从未赋值)
访问方式直接解引用先调用 Value()

示例 1: 弱指针做临时缓存

使用弱指针的一个典型场景是在缓存中存储条目,同时不阻止它们被 GC 回收。

package mainimport ("fmt""runtime""sync""weak"
)type User struct {Name string
}var cache sync.Map // map[int]weak.Pointer[*User]func GetUser(id int) *User {// ① 先从缓存里取if wp, ok := cache.Load(id); ok {if u := wp.(weak.Pointer[User]).Value(); u != nil {fmt.Println("cache hit")return u}}// ② 真正加载(这里直接构造)u := &User{Name: fmt.Sprintf("user-%d", id)}cache.Store(id, weak.Make(u))fmt.Println("load from DB")return u
}func main() {u := GetUser(1) // load from DBfmt.Println(u.Name)runtime.GC() // 即使立刻 GC,因 main 持有强引用,User 仍在u = nil      // 释放最后一个强引用runtime.GC() // 触发 GC,User 可能被回收_ = GetUser(1) // 如被回收,会再次 load from DB
}

在该缓存实现中,条目以弱指针形式存储。如果对象没有其他强引用,GC 可以将其回收;下次调用 GetUser 时,数据会被重新加载。

运行上述代码,输出如下:

$ go run cache.go 
load from DB
user-1
load from DB

为什么要使用弱指针?

常见场景包括:

  • 缓存:在不强制对象常驻内存的前提下存储它们,如果其他地方不再使用,对象就能被回收;
  • 观察者模式:保存对观察者的引用,同时不阻止它们被 GC 回收;
  • 规范化(Canonicalization):确保同一对象只有一个实例,并且在不再使用时可被回收;
  • 依赖关系图:在树或图等结构中避免形成引用环。

弱指针使用注意事项

  • 随时检查 nil:对象可能在任意 GC 周期后被回收,Value() 结果不可缓存。
  • 避免循环依赖:不要让弱指针中的对象重新持有创建它的容器,否则仍会形成强引用链。
  • 性能权衡:访问弱指针需要额外调用,且频繁从 nil 状态恢复对象会导致抖动。

示例 2:强指针的普通使用

package main  import (  "fmt"  "runtime"  
)  type Session struct {  ID string  
}  func main() {  s := new(Session) // 与 &Session{} 等价  s.ID = "abc123"  fmt.Println("strong ref alive:", s.ID)  s = nil           // 取消最后一个强引用  runtime.GC()      // 尝试触发 GC(仅演示,实际时机由运行时决定)  fmt.Println("done")  
}  

这里的 s 就是强指针,只要它仍然可达,Session 对象就绝不会被 GC 回收。

强指针指向的对象何时被 GC?

  • 可达性判定:Go 使用标记-清除式 GC。一次 GC 周期开始时,运行时会从根对象(栈、全局变量、当前寄存器等)向外遍历所有强引用
    • 能通过强引用链到达的对象称为可达 (reachable),一定存活;
    • 其余对象被标记为不可达 (unreachable),在清扫阶段释放。
  • 不存在“引用计数”:只有“是否从根可达”这一条件;变量数目多少、值是否相等都不影响回收;
  • 时间点不确定:GC 周期由调度器自动触发,开发者只能调用 runtime.GC() 进行“建议”式触发,不能保证立即回收;
  • 变量本身也会被 GC:若强指针变量 s 位于堆上且其所在结构不再可达,那么 s 本身也会被 GC;栈变量则随函数返回被回收。

总结一句:强指针保证可达对象在任意 GC 周期都处于“存活集合”中;一旦最后的强引用链断开,对象就会在下一个 GC 周期被自动释放。

  • 知识星球:云原生AI实战营。10+ 高质量体系课( Go、云原生、AI Infra)、15+ 实战项目,P8 技术专家助你提高技术天花板,冲击百万年薪!
  • 公众号:令飞编程,分享 Go、云原生、AI Infra 相关技术。回复「资料」免费下载 Go、云原生、AI 等学习资料;
  • 哔哩哔哩:令飞编程 ,分享技术、职场、面经等,并有免费直播课「云原生AI高新就业课」,大厂级项目实战到大厂面试通关;
http://www.dtcms.com/wzjs/420117.html

相关文章:

  • 设计logo网站免费奇米百度号码认证平台首页
  • 无锡自助做网站友情链接的方式如何选择
  • 网站上怎么做全景看图长沙seo优化排名
  • 广州网站制作建设seo网页推广
  • 设计工作室需要办理营业执照吗搜索引擎优化什么意思
  • 网站建设界面建议搜索引擎推广一般包括哪些
  • 上海空气中检测出阳性沈阳网站seo
  • 凡科网站设计百度百科推广联系方式
  • 傻瓜做网站视频seo优化教程
  • 代办公司注册需要什么材料武汉seo哪家好
  • 单页网站编辑器百度广告推广
  • 安丘网站建设报价seo美式
  • 海口市做网站的公司前端开发
  • 房地产三道红线搜索引擎优化人员优化
  • 建设银行网站会员注销西安关键词排名软件
  • 快手流量推广免费网站重庆专业做网站公司
  • 织梦备份网站数据太原关键词优化服务
  • 怎么在网站做系统网站优化公司
  • 做美足网站违法吗上海关键词优化排名哪家好
  • 各类网站规划百度一下百度搜索入口
  • 富德生命人寿保险公司官方网站保单查询最新疫情爆发
  • 襄阳网络公司 网站建设温州seo外包公司
  • 做任务赚钱的网站有哪些排名第一的助勃药
  • 广告传媒建设网站长沙网站seo收费标准
  • 做网站花多钱搜索引擎入口网址
  • 免费建站的方法永久免费域名注册
  • 什么网站是做货到付款的培训计划模板
  • 简单模板网站制作时间网络推广官网首页
  • 廊坊文安建设局网站成都网站快速排名优化
  • 做安全宣传的是什么网站网站seo设置是什么意思