// $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.Field(0) j := v.Field(1) assert(i.Interface() == j.Interface()) s := v.Field(2) t := v.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.Field(4) j = v.Field(5) assert(i.Interface() != j.Interface()) i = v.Field(6) j = v.Field(7) assert(i.Interface() != j.Interface()) i = v.Field(8) j = v.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() */