Home | History | Annotate | Download | only in interface
      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