package main import ( "fmt" "time" ) const NUM_ELEMENTS = 1000000 type HeavyThings = map[int][]int func main() { heavy_things_1 := make_heavy_things() heavy_things_2 := make_heavy_things() len := log_time("drop in another thread", func() int { tmp := heavy_things_2 heavy_things_2 = nil return fn_that_drops_heavy_things_in_another_thread(tmp) }) if len != NUM_ELEMENTS { panic("...") } len = log_time("drop in this thread", func() int { tmp := heavy_things_1 heavy_things_1 = nil return fn_that_drops_heavy_things(tmp) }) if len != NUM_ELEMENTS { panic("...") } } func make_heavy_things() *HeavyThings { ret := HeavyThings{} for i := int(0); i != NUM_ELEMENTS; i++ { ret[i] = []int{i} } return &ret } func fn_that_drops_heavy_things_in_another_thread(things *HeavyThings) int { len := len(*things) go func() { things = nil }() return len } func fn_that_drops_heavy_things(things *HeavyThings) int { len := len(*things) return len } func log_time(name string, f func() int) int { start := time.Now() result := f() fmt.Printf("%v %v\n", name, time.Now().Sub(start)) return result }