| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | // 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 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()    {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | var ( | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	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{} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	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 | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	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. | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func second(a ...interface{}) interface{} { | 
					
						
							|  |  |  | 	return a[1] | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	// Test equality. | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if u16 != iu16 { | 
					
						
							|  |  |  | 		panic("u16 != iu16") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if u16 != ju16 { | 
					
						
							|  |  |  | 		panic("u16 != ju16") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if u32 != iu32 { | 
					
						
							|  |  |  | 		panic("u32 != iu32") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if u32 != ju32 { | 
					
						
							|  |  |  | 		panic("u32 != ju32") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if u64 != iu64 { | 
					
						
							|  |  |  | 		panic("u64 != iu64") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if u64 != ju64 { | 
					
						
							|  |  |  | 		panic("u64 != ju64") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if u128 != iu128 { | 
					
						
							|  |  |  | 		panic("u128 != iu128") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if u128 != ju128 { | 
					
						
							|  |  |  | 		panic("u128 != ju128") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if f32 != if32 { | 
					
						
							|  |  |  | 		panic("f32 != if32") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if f32 != jf32 { | 
					
						
							|  |  |  | 		panic("f32 != jf32") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if f64 != if64 { | 
					
						
							|  |  |  | 		panic("f64 != if64") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if f64 != jf64 { | 
					
						
							|  |  |  | 		panic("f64 != jf64") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if c128 != ic128 { | 
					
						
							|  |  |  | 		panic("c128 != ic128") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if c128 != jc128 { | 
					
						
							|  |  |  | 		panic("c128 != jc128") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if s != is { | 
					
						
							|  |  |  | 		panic("s != is") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	if s != js { | 
					
						
							|  |  |  | 		panic("s != js") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 	if c != ic { | 
					
						
							|  |  |  | 		panic("c != ic") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-07-03 09:09:05 +10:00
										 |  |  | 	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. | 
					
						
							| 
									
										
										
										
											2012-06-14 10:43:20 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 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") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |