diff --git a/packages/datastructure/weakmap_test.go b/packages/datastructure/weakmap_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..2c239962d5c449f1834ec318cd0d1c977e1cb9b6
--- /dev/null
+++ b/packages/datastructure/weakmap_test.go
@@ -0,0 +1,92 @@
+package datastructure
+
+import (
+	"fmt"
+	"testing"
+)
+import "runtime"
+import "unsafe"
+import "errors"
+import "time"
+
+func TestWeakmap(t *testing.T) {
+	generateA(6)
+	fmt.Println("")
+
+	debugWeakMap(6)
+	fmt.Println("")
+
+	runtime.GC()
+	fmt.Println("GC runned.")
+
+	time.Sleep(1 * time.Second)
+
+	debugWeakMap(6)
+}
+
+func generateA(n int) {
+
+	for i := 0; i < n; i++ {
+		a := NewA()
+		WMap.Add(a)
+		fmt.Println("Added to WM A with id =", a.Id)
+	}
+
+}
+
+func debugWeakMap(n int) {
+	for i := 0; i < n; i++ {
+		if WMap.Has(i) {
+			fmt.Println("Has id =", i)
+		} else {
+			fmt.Println("Hasn't id =", i)
+		}
+	}
+}
+
+var aId int
+
+func NewA() *A {
+	aId++
+	return &A{aId}
+}
+
+var WMap = &WeakMap{weakMap: make(map[int]uintptr)}
+
+type WeakMap struct {
+	weakMap map[int]uintptr
+}
+
+type A struct {
+	Id int
+}
+
+func (w *WeakMap) Add(a *A) {
+	runtime.SetFinalizer(a, finalizer)
+
+	w.weakMap[a.Id] = uintptr(unsafe.Pointer(a))
+}
+
+func (w *WeakMap) Get(id int) (*A, error) {
+	if !w.Has(id) {
+		return nil, errors.New("")
+	}
+
+	a := (*A)(unsafe.Pointer(w.weakMap[id]))
+
+	return a, nil
+}
+
+func (w *WeakMap) Has(id int) bool {
+	_, ok := w.weakMap[id]
+	return ok
+}
+
+func (w *WeakMap) Remove(a *A) {
+	delete(w.weakMap, a.Id)
+}
+
+func finalizer(a *A) {
+	fmt.Println(a.Id)
+	WMap.Remove(a)
+}