| // run | |
| // Copyright 2012 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 conversion from non-interface types to the empty interface. | |
| package main | |
| type J interface { | |
| Method() | |
| } | |
| type ( | |
| U16 uint16 | |
| U32 uint32 | |
| U64 uint64 | |
| U128 [2]uint64 | |
| F32 float32 | |
| F64 float64 | |
| C128 complex128 | |
| S string | |
| B []byte | |
| M map[int]int | |
| C chan int | |
| Z struct{} | |
| ) | |
| func (U16) Method() {} | |
| func (U32) Method() {} | |
| func (U64) Method() {} | |
| func (U128) Method() {} | |
| func (F32) Method() {} | |
| func (F64) Method() {} | |
| func (C128) Method() {} | |
| func (S) Method() {} | |
| func (B) Method() {} | |
| func (M) Method() {} | |
| func (C) Method() {} | |
| func (Z) Method() {} | |
| var ( | |
| u16 = U16(1) | |
| u32 = U32(2) | |
| u64 = U64(3) | |
| u128 = U128{4, 5} | |
| f32 = F32(6) | |
| f64 = F64(7) | |
| c128 = C128(8 + 9i) | |
| s = S("10") | |
| b = B("11") | |
| m = M{12: 13} | |
| c = make(C, 14) | |
| z = Z{} | |
| p = &z | |
| pp = &p | |
| ) | |
| var ( | |
| iu16 interface{} = u16 | |
| iu32 interface{} = u32 | |
| iu64 interface{} = u64 | |
| iu128 interface{} = u128 | |
| if32 interface{} = f32 | |
| if64 interface{} = f64 | |
| ic128 interface{} = c128 | |
| is interface{} = s | |
| ib interface{} = b | |
| im interface{} = m | |
| ic interface{} = c | |
| iz interface{} = z | |
| ip interface{} = p | |
| ipp interface{} = pp | |
| ju16 J = u16 | |
| ju32 J = u32 | |
| ju64 J = u64 | |
| ju128 J = u128 | |
| jf32 J = f32 | |
| jf64 J = f64 | |
| jc128 J = c128 | |
| js J = s | |
| jb J = b | |
| jm J = m | |
| jc J = c | |
| jz J = z | |
| jp J = p // The method set for *T contains the methods for T. | |
| // pp does not implement error. | |
| ) | |
| func second(a ...interface{}) interface{} { | |
| return a[1] | |
| } | |
| func main() { | |
| // Test equality. | |
| if u16 != iu16 { | |
| panic("u16 != iu16") | |
| } | |
| if u16 != ju16 { | |
| panic("u16 != ju16") | |
| } | |
| if u32 != iu32 { | |
| panic("u32 != iu32") | |
| } | |
| if u32 != ju32 { | |
| panic("u32 != ju32") | |
| } | |
| if u64 != iu64 { | |
| panic("u64 != iu64") | |
| } | |
| if u64 != ju64 { | |
| panic("u64 != ju64") | |
| } | |
| if u128 != iu128 { | |
| panic("u128 != iu128") | |
| } | |
| if u128 != ju128 { | |
| panic("u128 != ju128") | |
| } | |
| if f32 != if32 { | |
| panic("f32 != if32") | |
| } | |
| if f32 != jf32 { | |
| panic("f32 != jf32") | |
| } | |
| if f64 != if64 { | |
| panic("f64 != if64") | |
| } | |
| if f64 != jf64 { | |
| panic("f64 != jf64") | |
| } | |
| if c128 != ic128 { | |
| panic("c128 != ic128") | |
| } | |
| if c128 != jc128 { | |
| panic("c128 != jc128") | |
| } | |
| if s != is { | |
| panic("s != is") | |
| } | |
| if s != js { | |
| panic("s != js") | |
| } | |
| if c != ic { | |
| panic("c != ic") | |
| } | |
| if c != jc { | |
| panic("c != jc") | |
| } | |
| // There are no tests for b and m, as slices and maps are not comparable by ==. | |
| if z != iz { | |
| panic("z != iz") | |
| } | |
| if z != jz { | |
| panic("z != jz") | |
| } | |
| if p != ip { | |
| panic("p != ip") | |
| } | |
| if p != jp { | |
| panic("p != jp") | |
| } | |
| if pp != ipp { | |
| panic("pp != ipp") | |
| } | |
| // pp does not implement J. | |
| // Test that non-interface types can be used as ...interface{} arguments. | |
| if got := second(z, p, pp, u16, u32, u64, u128, f32, f64, c128, s, b, m, c); got != ip { | |
| println("second: got", got, "want", ip) | |
| panic("fail") | |
| } | |
| // Test that non-interface types can be sent on a chan interface{}. | |
| const n = 100 | |
| uc := make(chan interface{}) | |
| go func() { | |
| for i := 0; i < n; i++ { | |
| select { | |
| case uc <- nil: | |
| case uc <- u32: | |
| case uc <- u64: | |
| case uc <- u128: | |
| } | |
| } | |
| }() | |
| for i := 0; i < n; i++ { | |
| if got := <-uc; got != nil && got != u32 && got != u64 && got != u128 { | |
| println("recv: i", i, "got", got) | |
| panic("fail") | |
| } | |
| } | |
| } |