mirror of
https://github.com/golang/go
synced 2024-11-22 20:24:47 -07:00
c7d30bceb2
R=r DELTA=20 (20 added, 0 deleted, 0 changed) OCL=28707 CL=28716
98 lines
2.0 KiB
Go
98 lines
2.0 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.
|
|
|
|
// 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()
|
|
*/
|