github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/interface/fake.go (about) 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 10 package main 11 12 import "reflect" 13 14 type 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 31 func add(s, t string) string { 32 return s + t 33 } 34 35 func assert(b bool) { 36 if !b { 37 panic("assert") 38 } 39 } 40 41 func 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 /* 81 comparing uncomparable type float32 82 throw: interface compare 83 84 panic PC=0x28ceb8 [1] 85 throw+0x41 /Users/rsc/goX/src/runtime/runtime.c:54 86 throw(0x3014a, 0x0) 87 ifaceeq+0x15c /Users/rsc/goX/src/runtime/iface.c:501 88 ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) 89 sys·ifaceeq+0x48 /Users/rsc/goX/src/runtime/iface.c:527 90 sys·ifaceeq(0x2aa7c0, 0x0, 0x0, 0x0, 0x2aa7c0, ...) 91 main·main+0x190 /Users/rsc/goX/src/cmd/gc/x.go:10 92 main·main() 93 mainstart+0xf /Users/rsc/goX/src/runtime/amd64/asm.s:53 94 mainstart() 95 sys·Goexit /Users/rsc/goX/src/runtime/proc.c:124 96 sys·Goexit() 97 */