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