| // 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 all the different interface conversion runtime functions. | 
 |  | 
 | package main | 
 |  | 
 | type Stringer interface { | 
 | 	String() string | 
 | } | 
 | type StringLengther interface { | 
 | 	String() string | 
 | 	Length() int | 
 | } | 
 | type Empty interface{} | 
 |  | 
 | type T string | 
 |  | 
 | func (t T) String() string { | 
 | 	return string(t) | 
 | } | 
 | func (t T) Length() int { | 
 | 	return len(t) | 
 | } | 
 |  | 
 | type U string | 
 |  | 
 | func (u U) String() string { | 
 | 	return string(u) | 
 | } | 
 |  | 
 | var t = T("hello") | 
 | var u = U("goodbye") | 
 | var e Empty | 
 | var s Stringer = t | 
 | var sl StringLengther = t | 
 | var i int | 
 | var ok bool | 
 |  | 
 | func hello(s string) { | 
 | 	if s != "hello" { | 
 | 		println("not hello: ", s) | 
 | 		panic("fail") | 
 | 	} | 
 | } | 
 |  | 
 | func five(i int) { | 
 | 	if i != 5 { | 
 | 		println("not 5: ", i) | 
 | 		panic("fail") | 
 | 	} | 
 | } | 
 |  | 
 | func true(ok bool) { | 
 | 	if !ok { | 
 | 		panic("not true") | 
 | 	} | 
 | } | 
 |  | 
 | func false(ok bool) { | 
 | 	if ok { | 
 | 		panic("not false") | 
 | 	} | 
 | } | 
 |  | 
 | func main() { | 
 | 	// T2I | 
 | 	s = t | 
 | 	hello(s.String()) | 
 |  | 
 | 	// I2T | 
 | 	t = s.(T) | 
 | 	hello(t.String()) | 
 |  | 
 | 	// T2E | 
 | 	e = t | 
 |  | 
 | 	// E2T | 
 | 	t = e.(T) | 
 | 	hello(t.String()) | 
 |  | 
 | 	// T2I again | 
 | 	sl = t | 
 | 	hello(sl.String()) | 
 | 	five(sl.Length()) | 
 |  | 
 | 	// I2I static | 
 | 	s = sl | 
 | 	hello(s.String()) | 
 |  | 
 | 	// I2I dynamic | 
 | 	sl = s.(StringLengther) | 
 | 	hello(sl.String()) | 
 | 	five(sl.Length()) | 
 |  | 
 | 	// I2E (and E2T) | 
 | 	e = s | 
 | 	hello(e.(T).String()) | 
 |  | 
 | 	// E2I | 
 | 	s = e.(Stringer) | 
 | 	hello(s.String()) | 
 |  | 
 | 	// I2T2 true | 
 | 	t, ok = s.(T) | 
 | 	true(ok) | 
 | 	hello(t.String()) | 
 |  | 
 | 	// I2T2 false | 
 | 	_, ok = s.(U) | 
 | 	false(ok) | 
 |  | 
 | 	// I2I2 true | 
 | 	sl, ok = s.(StringLengther) | 
 | 	true(ok) | 
 | 	hello(sl.String()) | 
 | 	five(sl.Length()) | 
 |  | 
 | 	// I2I2 false (and T2I) | 
 | 	s = u | 
 | 	sl, ok = s.(StringLengther) | 
 | 	false(ok) | 
 |  | 
 | 	// E2T2 true | 
 | 	t, ok = e.(T) | 
 | 	true(ok) | 
 | 	hello(t.String()) | 
 |  | 
 | 	// E2T2 false | 
 | 	i, ok = e.(int) | 
 | 	false(ok) | 
 |  | 
 | 	// E2I2 true | 
 | 	sl, ok = e.(StringLengther) | 
 | 	true(ok) | 
 | 	hello(sl.String()) | 
 | 	five(sl.Length()) | 
 |  | 
 | 	// E2I2 false (and T2E) | 
 | 	e = u | 
 | 	sl, ok = e.(StringLengther) | 
 | 	false(ok) | 
 | } |