|  | // 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. | 
|  |  | 
|  | // Test interfaces and methods. | 
|  |  | 
|  | 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); } | 
|  | } |