golang的wrap
在golang中,我们有时候会对对象包装一层wrap,当我们通过调用子对象的方法时,系统持有的是子对象,而非wrap。
如下的代码中:
1 | package main |
此时运行结果是:
1 | $ go run main.go |
go w.f()
这行代码实际运行的是运行的是go w.core.f()
,实际上系统持有的对象是w.core,不是w,所以在gc的时候会被回收,如果我们添加如下的代码:
1 | package main |
此时运行结果如下,说明不停的gc,也不会回收掉w。而这就是因为增加了一个defer w.keepAlive()
,虽然是空函数,但是还是能够保持w对象到select结束。
1 | $ go run main.go |