// run // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main type Iputs interface { puts (s string) string; } // --------- type Print struct { whoami int; put Iputs; } func (p *Print) dop() string { r := " print " + string(p.whoami + '0') return r + p.put.puts("abc"); } // --------- type Bio struct { whoami int; put Iputs; } func (b *Bio) puts(s string) string { r := " bio " + string(b.whoami + '0') return r + b.put.puts(s); } // --------- type File struct { whoami int; put Iputs; } func (f *File) puts(s string) string { return " file " + string(f.whoami + '0') + " -- " + s } func main() { p := new(Print); b := new(Bio); f := new(File); p.whoami = 1; p.put = b; b.whoami = 2; b.put = f; f.whoami = 3; r := p.dop(); expected := " print 1 bio 2 file 3 -- abc" if r != expected { panic(r + " != " + expected) } }