49 lines
713 B
Go
49 lines
713 B
Go
package main
|
|
|
|
import (
|
|
"runtime"
|
|
"time"
|
|
"weak"
|
|
)
|
|
|
|
type WeakMap struct {
|
|
data map[string]weak.Pointer[string]
|
|
}
|
|
|
|
func NewWeakMap() WeakMap {
|
|
return WeakMap{
|
|
data: make(map[string]weak.Pointer[string]),
|
|
}
|
|
}
|
|
|
|
func (w *WeakMap) Set(key string, value *string) {
|
|
runtime.AddCleanup(value, w.Delete, key)
|
|
w.data[key] = weak.Make(value)
|
|
}
|
|
|
|
func (w *WeakMap) Get(key string) *string {
|
|
if ptr, ok := w.data[key]; ok {
|
|
return ptr.Value()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (w *WeakMap) Delete(key string) {
|
|
delete(w.data, key)
|
|
}
|
|
|
|
func main() {
|
|
data := NewWeakMap()
|
|
|
|
key := "my key"
|
|
value := "my data"
|
|
data.Set(key, &value)
|
|
|
|
runtime.GC()
|
|
time.Sleep(time.Second)
|
|
|
|
pointer := data.Get(key)
|
|
println(pointer == nil)
|
|
}
|