// 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) | |
} |