Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 1 | // $G $D/$F.go && $L $F.$A && ./$A.out |
| 2 | |
| 3 | // Copyright 2009 The Go Authors. All rights reserved. |
| 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
| 7 | package main |
| 8 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 9 | type Iputs interface { |
Ian Lance Taylor | 5e77b00 | 2012-01-18 16:12:24 -0800 | [diff] [blame^] | 10 | puts (s string) string; |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 11 | } |
| 12 | |
| 13 | // --------- |
| 14 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 15 | type Print struct { |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 16 | whoami int; |
| 17 | put Iputs; |
| 18 | } |
| 19 | |
Ian Lance Taylor | 5e77b00 | 2012-01-18 16:12:24 -0800 | [diff] [blame^] | 20 | func (p *Print) dop() string { |
| 21 | r := " print " + string(p.whoami + '0') |
| 22 | return r + p.put.puts("abc"); |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 23 | } |
| 24 | |
| 25 | // --------- |
| 26 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 27 | type Bio struct { |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 28 | whoami int; |
| 29 | put Iputs; |
| 30 | } |
| 31 | |
Ian Lance Taylor | 5e77b00 | 2012-01-18 16:12:24 -0800 | [diff] [blame^] | 32 | func (b *Bio) puts(s string) string { |
| 33 | r := " bio " + string(b.whoami + '0') |
| 34 | return r + b.put.puts(s); |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 35 | } |
| 36 | |
| 37 | // --------- |
| 38 | |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 39 | type File struct { |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 40 | whoami int; |
| 41 | put Iputs; |
| 42 | } |
| 43 | |
Ian Lance Taylor | 5e77b00 | 2012-01-18 16:12:24 -0800 | [diff] [blame^] | 44 | func (f *File) puts(s string) string { |
| 45 | return " file " + string(f.whoami + '0') + " -- " + s |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 46 | } |
| 47 | |
| 48 | func |
Robert Griesemer | 581530e | 2009-12-10 12:53:23 -0800 | [diff] [blame] | 49 | main() { |
Russ Cox | 5564504 | 2009-01-06 15:19:02 -0800 | [diff] [blame] | 50 | p := new(Print); |
| 51 | b := new(Bio); |
| 52 | f := new(File); |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 53 | |
| 54 | p.whoami = 1; |
| 55 | p.put = b; |
| 56 | |
| 57 | b.whoami = 2; |
| 58 | b.put = f; |
| 59 | |
| 60 | f.whoami = 3; |
| 61 | |
Ian Lance Taylor | 5e77b00 | 2012-01-18 16:12:24 -0800 | [diff] [blame^] | 62 | r := p.dop(); |
| 63 | expected := " print 1 bio 2 file 3 -- abc" |
| 64 | if r != expected { |
| 65 | panic(r + " != " + expected) |
| 66 | } |
Rob Pike | ab34d15 | 2008-06-06 14:27:34 -0700 | [diff] [blame] | 67 | } |