On Saturday, January 28, 2017 at 9:33:51 PM UTC+8, C Banning wrote: > > From the doc: "The finalizer for obj is scheduled to run at some > arbitrary time after obj becomes unreachable. There is no guarantee that > finalizers will run before a program exits, so typically they are useful > only for releasing non-memory resources associated with an object during a > long-running program." >
If this is true, then the SetFinalizer function would be much meaningless. BTW, it looks both finalizer will get executed if let the program sleep more than 10us at the beginning: package main import "time" import "runtime" func main() { time.Sleep(10 * time.Microsecond) // if sleep 10 Microsecond here, 2 and 1 will both be out // if sleep 1 Microsecond here, still only 2 will out t1 := new(int) t2 := new(int) runtime.SetFinalizer(t1, func(*int) {println(1)}) runtime.SetFinalizer(t2, func(*int) {println(2)}) runtime.GC() time.Sleep(time.Second * 20) } > > > On Saturday, January 28, 2017 at 6:17:37 AM UTC-7, T L wrote: >> >> >> >> package main >> >> import "time" >> import "runtime" >> >> type T1 struct{ i int } >> type T2 struct{ i int } >> >> func main() { >> t1 := new(T1) >> t2 := new(T2) >> >> runtime.SetFinalizer(t1, func(*T1) {println(1)}) >> runtime.SetFinalizer(t2, func(*T2) {println(2)}) >> runtime.GC() >> time.Sleep(time.Second * 2) >> >> // the program will output: 2 >> // if I adjust the order of the declarations of t1 and t2, >> // the program will output: 1 >> } >> >> Why the finalizer for the first declaration will not get called? >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.