| // $G $D/$F.go && $L $F.$A && ./$A.out |
| |
| // 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 S struct { |
| a,b int; |
| } |
| |
| type I1 interface { |
| f ()int; |
| } |
| |
| type I2 interface { |
| g() int; |
| f() int; |
| } |
| |
| func (this *S) f()int { |
| return this.a; |
| } |
| |
| func (this *S) g()int { |
| return this.b; |
| } |
| |
| func |
| main() { |
| var i1 I1; |
| var i2 I2; |
| var g *S; |
| |
| s := new(S); |
| s.a = 5; |
| s.b = 6; |
| |
| // call structure |
| if s.f() != 5 { panic(11); } |
| if s.g() != 6 { panic(12); } |
| |
| i1 = s; // convert S to I1 |
| i2 = i1.(I2); // convert I1 to I2 |
| |
| // call interface |
| if i1.f() != 5 { panic(21); } |
| if i2.f() != 5 { panic(22); } |
| if i2.g() != 6 { panic(23); } |
| |
| g = i1.(*S); // convert I1 to S |
| if g != s { panic(31); } |
| |
| g = i2.(*S); // convert I2 to S |
| if g != s { panic(32); } |
| } |