mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 16:50:58 +00:00 
			
		
		
		
	
		
			
	
	
		
			95 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			95 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | // $G $D/$F.go && $L $F.$A && ./$A.out | ||
|  | 
 | ||
|  | // Copyright 2009 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. | ||
|  | 
 | ||
|  | package main | ||
|  | 
 | ||
|  | import "reflect" | ||
|  | 
 | ||
|  | type T struct { | ||
|  | 	f float32; | ||
|  | 	g float32; | ||
|  | 
 | ||
|  | 	s string; | ||
|  | 	t string; | ||
|  | 
 | ||
|  | 	u uint32; | ||
|  | 	v uint32; | ||
|  | 
 | ||
|  | 	w uint32; | ||
|  | 	x uint32; | ||
|  | 
 | ||
|  | 	y uint32; | ||
|  | 	z uint32; | ||
|  | } | ||
|  | 
 | ||
|  | func add(s, t string) string { | ||
|  | 	return s + t; | ||
|  | } | ||
|  | 
 | ||
|  | func assert(b bool) { | ||
|  | 	if !b { | ||
|  | 		panic("assert"); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | func main() { | ||
|  | 	var x T; | ||
|  | 	x.f = 1.0; | ||
|  | 	x.g = x.f; | ||
|  | 	x.s = add("abc", "def"); | ||
|  | 	x.t = add("abc", "def"); | ||
|  | 	x.u = 1; | ||
|  | 	x.v = 2; | ||
|  | 	x.w = 1<<28; | ||
|  | 	x.x = 2<<28; | ||
|  | 	x.y = 0x12345678; | ||
|  | 	x.z = x.y; | ||
|  | 
 | ||
|  | 	// check mem and string | ||
|  | 	v := reflect.NewValue(x); | ||
|  | 	i := v.(reflect.StructValue).Field(0); | ||
|  | 	j := v.(reflect.StructValue).Field(1); | ||
|  | 	assert(i.Interface() == j.Interface()); | ||
|  | 
 | ||
|  | 	s := v.(reflect.StructValue).Field(2); | ||
|  | 	t := v.(reflect.StructValue).Field(3); | ||
|  | 	assert(s.Interface() == t.Interface()); | ||
|  | 
 | ||
|  | 	// make sure different values are different. | ||
|  | 	// make sure whole word is being compared, | ||
|  | 	// not just a single byte. | ||
|  | 	i = v.(reflect.StructValue).Field(4); | ||
|  | 	j = v.(reflect.StructValue).Field(5); | ||
|  | 	assert(i.Interface() != j.Interface()); | ||
|  | 
 | ||
|  | 	i = v.(reflect.StructValue).Field(6); | ||
|  | 	j = v.(reflect.StructValue).Field(7); | ||
|  | 	assert(i.Interface() != j.Interface()); | ||
|  | 
 | ||
|  | 	i = v.(reflect.StructValue).Field(8); | ||
|  | 	j = v.(reflect.StructValue).Field(9); | ||
|  | 	assert(i.Interface() == j.Interface()); | ||
|  | } | ||
|  | 
 | ||
|  | /* | ||
|  | comparing uncomparable type float32 | ||
|  | throw: interface compare | ||
|  | 
 | ||
|  | panic PC=0x28ceb8 [1] | ||
|  | throw+0x41 /Users/rsc/goX/src/runtime/runtime.c:54 | ||
|  | 	throw(0x3014a, 0x0) | ||
|  | ifaceeq+0x15c /Users/rsc/goX/src/runtime/iface.c:501 | ||
|  | 	ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) | ||
|  | sys·ifaceeq+0x48 /Users/rsc/goX/src/runtime/iface.c:527 | ||
|  | 	sys·ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) | ||
|  | main·main+0x190 /Users/rsc/goX/src/cmd/gc/x.go:10 | ||
|  | 	main·main() | ||
|  | mainstart+0xf /Users/rsc/goX/src/runtime/amd64/asm.s:53 | ||
|  | 	mainstart() | ||
|  | sys·Goexit /Users/rsc/goX/src/runtime/proc.c:124 | ||
|  | 	sys·Goexit() | ||
|  | */ |