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