github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/convT2X.go (about) 1 // run 2 3 // Copyright 2012 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 conversion from non-interface types to the empty interface. 8 9 package main 10 11 type J interface { 12 Method() 13 } 14 15 type ( 16 U16 uint16 17 U32 uint32 18 U64 uint64 19 U128 [2]uint64 20 F32 float32 21 F64 float64 22 C128 complex128 23 S string 24 B []byte 25 M map[int]int 26 C chan int 27 Z struct{} 28 ) 29 30 func (U16) Method() {} 31 func (U32) Method() {} 32 func (U64) Method() {} 33 func (U128) Method() {} 34 func (F32) Method() {} 35 func (F64) Method() {} 36 func (C128) Method() {} 37 func (S) Method() {} 38 func (B) Method() {} 39 func (M) Method() {} 40 func (C) Method() {} 41 func (Z) Method() {} 42 43 var ( 44 u16 = U16(1) 45 u32 = U32(2) 46 u64 = U64(3) 47 u128 = U128{4, 5} 48 f32 = F32(6) 49 f64 = F64(7) 50 c128 = C128(8 + 9i) 51 s = S("10") 52 b = B("11") 53 m = M{12: 13} 54 c = make(C, 14) 55 z = Z{} 56 p = &z 57 pp = &p 58 ) 59 60 var ( 61 iu16 interface{} = u16 62 iu32 interface{} = u32 63 iu64 interface{} = u64 64 iu128 interface{} = u128 65 if32 interface{} = f32 66 if64 interface{} = f64 67 ic128 interface{} = c128 68 is interface{} = s 69 ib interface{} = b 70 im interface{} = m 71 ic interface{} = c 72 iz interface{} = z 73 ip interface{} = p 74 ipp interface{} = pp 75 76 ju16 J = u16 77 ju32 J = u32 78 ju64 J = u64 79 ju128 J = u128 80 jf32 J = f32 81 jf64 J = f64 82 jc128 J = c128 83 js J = s 84 jb J = b 85 jm J = m 86 jc J = c 87 jz J = z 88 jp J = p // The method set for *T contains the methods for T. 89 // pp does not implement error. 90 ) 91 92 func second(a ...interface{}) interface{} { 93 return a[1] 94 } 95 96 func main() { 97 // Test equality. 98 if u16 != iu16 { 99 panic("u16 != iu16") 100 } 101 if u16 != ju16 { 102 panic("u16 != ju16") 103 } 104 if u32 != iu32 { 105 panic("u32 != iu32") 106 } 107 if u32 != ju32 { 108 panic("u32 != ju32") 109 } 110 if u64 != iu64 { 111 panic("u64 != iu64") 112 } 113 if u64 != ju64 { 114 panic("u64 != ju64") 115 } 116 if u128 != iu128 { 117 panic("u128 != iu128") 118 } 119 if u128 != ju128 { 120 panic("u128 != ju128") 121 } 122 if f32 != if32 { 123 panic("f32 != if32") 124 } 125 if f32 != jf32 { 126 panic("f32 != jf32") 127 } 128 if f64 != if64 { 129 panic("f64 != if64") 130 } 131 if f64 != jf64 { 132 panic("f64 != jf64") 133 } 134 if c128 != ic128 { 135 panic("c128 != ic128") 136 } 137 if c128 != jc128 { 138 panic("c128 != jc128") 139 } 140 if s != is { 141 panic("s != is") 142 } 143 if s != js { 144 panic("s != js") 145 } 146 if c != ic { 147 panic("c != ic") 148 } 149 if c != jc { 150 panic("c != jc") 151 } 152 // There are no tests for b and m, as slices and maps are not comparable by ==. 153 if z != iz { 154 panic("z != iz") 155 } 156 if z != jz { 157 panic("z != jz") 158 } 159 if p != ip { 160 panic("p != ip") 161 } 162 if p != jp { 163 panic("p != jp") 164 } 165 if pp != ipp { 166 panic("pp != ipp") 167 } 168 // pp does not implement J. 169 170 // Test that non-interface types can be used as ...interface{} arguments. 171 if got := second(z, p, pp, u16, u32, u64, u128, f32, f64, c128, s, b, m, c); got != ip { 172 println("second: got", got, "want", ip) 173 panic("fail") 174 } 175 176 // Test that non-interface types can be sent on a chan interface{}. 177 const n = 100 178 uc := make(chan interface{}) 179 go func() { 180 for i := 0; i < n; i++ { 181 select { 182 case uc <- nil: 183 case uc <- u32: 184 case uc <- u64: 185 case uc <- u128: 186 } 187 } 188 }() 189 for i := 0; i < n; i++ { 190 if got := <-uc; got != nil && got != u32 && got != u64 && got != u128 { 191 println("recv: i", i, "got", got) 192 panic("fail") 193 } 194 } 195 }