1// run 2 3// Copyright 2009 The Go Authors. All rights reserved. 4// Use of this source code is governed by a BSD-style 5// license that can be found in the LICENSE file. 6 7// Test interface comparisons using types hidden 8// inside reflected-on structs. 9 10package main 11 12import "reflect" 13 14type T struct { 15 F float32 16 G float32 17 18 S string 19 T string 20 21 U uint32 22 V uint32 23 24 W uint32 25 X uint32 26 27 Y uint32 28 Z uint32 29} 30 31func add(s, t string) string { 32 return s + t 33} 34 35func assert(b bool) { 36 if !b { 37 panic("assert") 38 } 39} 40 41func main() { 42 var x T 43 x.F = 1.0 44 x.G = x.F 45 x.S = add("abc", "def") 46 x.T = add("abc", "def") 47 x.U = 1 48 x.V = 2 49 x.W = 1 << 28 50 x.X = 2 << 28 51 x.Y = 0x12345678 52 x.Z = x.Y 53 54 // check mem and string 55 v := reflect.ValueOf(x) 56 i := v.Field(0) 57 j := v.Field(1) 58 assert(i.Interface() == j.Interface()) 59 60 s := v.Field(2) 61 t := v.Field(3) 62 assert(s.Interface() == t.Interface()) 63 64 // make sure different values are different. 65 // make sure whole word is being compared, 66 // not just a single byte. 67 i = v.Field(4) 68 j = v.Field(5) 69 assert(i.Interface() != j.Interface()) 70 71 i = v.Field(6) 72 j = v.Field(7) 73 assert(i.Interface() != j.Interface()) 74 75 i = v.Field(8) 76 j = v.Field(9) 77 assert(i.Interface() == j.Interface()) 78} 79 80/* 81comparing uncomparable type float32 82throw: interface compare 83 84panic PC=0x28ceb8 [1] 85throw+0x41 /Users/rsc/goX/src/runtime/runtime.c:54 86 throw(0x3014a, 0x0) 87ifaceeq+0x15c /Users/rsc/goX/src/runtime/iface.c:501 88 ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) 89sys·ifaceeq+0x48 /Users/rsc/goX/src/runtime/iface.c:527 90 sys·ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) 91main·main+0x190 /Users/rsc/goX/src/cmd/gc/x.go:10 92 main·main() 93mainstart+0xf /Users/rsc/goX/src/runtime/amd64/asm.s:53 94 mainstart() 95sys·Goexit /Users/rsc/goX/src/runtime/proc.c:124 96 sys·Goexit() 97*/ 98