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