1 // run 2 3 // Copyright 2009 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test all the different interface conversion runtime functions. 8 9 package main 10 11 type Stringer interface { 12 String() string 13 } 14 type StringLengther interface { 15 String() string 16 Length() int 17 } 18 type Empty interface{} 19 20 type T string 21 22 func (t T) String() string { 23 return string(t) 24 } 25 func (t T) Length() int { 26 return len(t) 27 } 28 29 type U string 30 31 func (u U) String() string { 32 return string(u) 33 } 34 35 var t = T("hello") 36 var u = U("goodbye") 37 var e Empty 38 var s Stringer = t 39 var sl StringLengther = t 40 var i int 41 var ok bool 42 43 func hello(s string) { 44 if s != "hello" { 45 println("not hello: ", s) 46 panic("fail") 47 } 48 } 49 50 func five(i int) { 51 if i != 5 { 52 println("not 5: ", i) 53 panic("fail") 54 } 55 } 56 57 func true(ok bool) { 58 if !ok { 59 panic("not true") 60 } 61 } 62 63 func false(ok bool) { 64 if ok { 65 panic("not false") 66 } 67 } 68 69 func main() { 70 // T2I 71 s = t 72 hello(s.String()) 73 74 // I2T 75 t = s.(T) 76 hello(t.String()) 77 78 // T2E 79 e = t 80 81 // E2T 82 t = e.(T) 83 hello(t.String()) 84 85 // T2I again 86 sl = t 87 hello(sl.String()) 88 five(sl.Length()) 89 90 // I2I static 91 s = sl 92 hello(s.String()) 93 94 // I2I dynamic 95 sl = s.(StringLengther) 96 hello(sl.String()) 97 five(sl.Length()) 98 99 // I2E (and E2T) 100 e = s 101 hello(e.(T).String()) 102 103 // E2I 104 s = e.(Stringer) 105 hello(s.String()) 106 107 // I2T2 true 108 t, ok = s.(T) 109 true(ok) 110 hello(t.String()) 111 112 // I2T2 false 113 _, ok = s.(U) 114 false(ok) 115 116 // I2I2 true 117 sl, ok = s.(StringLengther) 118 true(ok) 119 hello(sl.String()) 120 five(sl.Length()) 121 122 // I2I2 false (and T2I) 123 s = u 124 sl, ok = s.(StringLengther) 125 false(ok) 126 127 // E2T2 true 128 t, ok = e.(T) 129 true(ok) 130 hello(t.String()) 131 132 // E2T2 false 133 i, ok = e.(int) 134 false(ok) 135 136 // E2I2 true 137 sl, ok = e.(StringLengther) 138 true(ok) 139 hello(sl.String()) 140 five(sl.Length()) 141 142 // E2I2 false (and T2E) 143 e = u 144 sl, ok = e.(StringLengther) 145 false(ok) 146 } 147