Golang 垃圾回收和 SetFinalizer
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
type SampleResource struct {
id int
done chan bool
}
func NewSampleResource(id int) *SampleResource {
return &SampleResource{
id: id,
done: make(chan bool),
}
}
func (r *SampleResource) Close() {
fmt.Printf("SampleResource %d closed\n", r.id)
close(r.done)
}
func (r *SampleResource) Stop() {
fmt.Printf("SampleResource %d stopped\n", r.id)
}
func main() {
runtime.GOMAXPROCS(1)
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
r := NewSampleResource(1)
defer r.Close()
// 设置 finalizer 函数
runtime.SetFinalizer(r, (*SampleResource).Stop)
<-r.done
}()
wg.Wait()
fmt.Println("main exit")
}
这段代码首先定义了一个结构体SampleResource
,包含资源标识和一个用于同步的通道。然后实现了一个创建资源的函数和一个释放资源的方法Close
。在main
函数中,我们创建了一个SampleResource
实例,并通过SetFinalizer
设置了一个finalizer函数Stop
,该函数在资源垃圾收集时会被调用。这样,即使资源被提前关闭了,如果垃圾收集器运行,Stop
方法也会被调用,从而可以进行一些清理工作。
评论已关闭