| // +build ignore |
| |
| package main |
| |
| import ( |
| "fmt" |
| "runtime" |
| ) |
| |
| // 1 START OMIT |
| type P *P |
| type S []S |
| type C chan C |
| type M map[int]M |
| |
| // 1 END OMIT |
| |
| // 2 START OMIT |
| func Val(p *P) int { |
| if p == nil { |
| return 0 |
| } else { |
| return 1 + Val(*p) |
| } |
| } |
| |
| func Add(a, b *P) *P { |
| if b == nil { |
| return a |
| } else { |
| a1 := new(P) |
| *a1 = a // a1 == a + 1 |
| return Add(a1, *b) // a + b == Add(a+1, b-1) |
| } |
| } |
| |
| // 2 END OMIT |
| |
| // 3 START OMIT |
| |
| func Print(p *P) { |
| fmt.Println(Val(p)) |
| } |
| |
| func Allocate() { |
| p := new(P); *p = new(P); **p = new(P) |
| runtime.SetFinalizer(p, Print) |
| runtime.SetFinalizer(*p, Print) |
| runtime.SetFinalizer(**p, Print) |
| } |
| |
| func main() { |
| Allocate() |
| for i := 0; i < 5; i++ { |
| runtime.GC() |
| runtime.Gosched() |
| } |
| } |
| |
| // 3 END OMIT |