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