| // $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. |
| |
| // Interface comparisons using types hidden |
| // inside reflected-on structs. |
| |
| 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() |
| */ |