Initial commit: Go 1.23 release state
This commit is contained in:
195
test/convT2X.go
Normal file
195
test/convT2X.go
Normal file
@@ -0,0 +1,195 @@
|
||||
// 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")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user