mirror of
https://github.com/golang/go
synced 2024-11-22 16:04:40 -07:00
115 lines
2.2 KiB
Go
115 lines
2.2 KiB
Go
|
// 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
|
||
|
|
||
|
var (
|
||
|
z = struct{}{}
|
||
|
p = &z
|
||
|
pp = &p
|
||
|
u16 = uint16(1)
|
||
|
u32 = uint32(2)
|
||
|
u64 = uint64(3)
|
||
|
u128 = [2]uint64{4, 5}
|
||
|
f32 = float32(6)
|
||
|
f64 = float64(7)
|
||
|
c128 = complex128(8 + 9i)
|
||
|
s = "10"
|
||
|
b = []byte("11")
|
||
|
m = map[int]int{12: 13}
|
||
|
c = make(chan int, 14)
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
iz interface{} = z
|
||
|
ip interface{} = p
|
||
|
ipp interface{} = pp
|
||
|
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
|
||
|
)
|
||
|
|
||
|
func second(a ...interface{}) interface{} {
|
||
|
return a[1]
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
// Test equality. There are no tests for b and m, as slices and
|
||
|
// maps are not comparable by ==.
|
||
|
if z != iz {
|
||
|
panic("z != iz")
|
||
|
}
|
||
|
if p != ip {
|
||
|
panic("p != ip")
|
||
|
}
|
||
|
if pp != ipp {
|
||
|
panic("pp != ipp")
|
||
|
}
|
||
|
if u16 != iu16 {
|
||
|
panic("u16 != iu16")
|
||
|
}
|
||
|
if u32 != iu32 {
|
||
|
panic("u32 != iu32")
|
||
|
}
|
||
|
if u64 != iu64 {
|
||
|
panic("u64 != iu64")
|
||
|
}
|
||
|
if u128 != iu128 {
|
||
|
panic("u128 != iu128")
|
||
|
}
|
||
|
if f32 != if32 {
|
||
|
panic("f32 != if32")
|
||
|
}
|
||
|
if f64 != if64 {
|
||
|
panic("f64 != if64")
|
||
|
}
|
||
|
if c128 != ic128 {
|
||
|
panic("c128 != ic128")
|
||
|
}
|
||
|
if s != is {
|
||
|
panic("s != is")
|
||
|
}
|
||
|
if c != ic {
|
||
|
panic("c != ic")
|
||
|
}
|
||
|
|
||
|
// 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")
|
||
|
}
|
||
|
}
|
||
|
}
|