Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
go
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
go
Commits
0e2bb62f
Commit
0e2bb62f
authored
Apr 25, 2011
by
Russ Cox
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reflect: rename Typeof, NewValue -> TypeOf, ValueOf
R=r, bradfitzgo CC=golang-dev
https://golang.org/cl/4433066
parent
41342dc7
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
158 additions
and
158 deletions
+158
-158
src/pkg/reflect/all_test.go
src/pkg/reflect/all_test.go
+116
-116
src/pkg/reflect/deepequal.go
src/pkg/reflect/deepequal.go
+2
-2
src/pkg/reflect/set_test.go
src/pkg/reflect/set_test.go
+32
-32
src/pkg/reflect/type.go
src/pkg/reflect/type.go
+4
-4
src/pkg/reflect/value.go
src/pkg/reflect/value.go
+4
-4
No files found.
src/pkg/reflect/all_test.go
View file @
0e2bb62f
...
...
@@ -37,7 +37,7 @@ func assert(t *testing.T, s, want string) {
}
}
func
typestring
(
i
interface
{})
string
{
return
Type
o
f
(
i
)
.
String
()
}
func
typestring
(
i
interface
{})
string
{
return
Type
O
f
(
i
)
.
String
()
}
var
typeTests
=
[]
pair
{
{
struct
{
x
int
}{},
"int"
},
...
...
@@ -209,13 +209,13 @@ func testType(t *testing.T, i int, typ Type, want string) {
func
TestTypes
(
t
*
testing
.
T
)
{
for
i
,
tt
:=
range
typeTests
{
testType
(
t
,
i
,
NewValue
(
tt
.
i
)
.
Field
(
0
)
.
Type
(),
tt
.
s
)
testType
(
t
,
i
,
ValueOf
(
tt
.
i
)
.
Field
(
0
)
.
Type
(),
tt
.
s
)
}
}
func
TestSet
(
t
*
testing
.
T
)
{
for
i
,
tt
:=
range
valueTests
{
v
:=
NewValue
(
tt
.
i
)
.
Elem
()
v
:=
ValueOf
(
tt
.
i
)
.
Elem
()
switch
v
.
Kind
()
{
case
Int
:
v
.
SetInt
(
132
)
...
...
@@ -259,40 +259,40 @@ func TestSet(t *testing.T) {
func
TestSetValue
(
t
*
testing
.
T
)
{
for
i
,
tt
:=
range
valueTests
{
v
:=
NewValue
(
tt
.
i
)
.
Elem
()
v
:=
ValueOf
(
tt
.
i
)
.
Elem
()
switch
v
.
Kind
()
{
case
Int
:
v
.
Set
(
NewValue
(
int
(
132
)))
v
.
Set
(
ValueOf
(
int
(
132
)))
case
Int8
:
v
.
Set
(
NewValue
(
int8
(
8
)))
v
.
Set
(
ValueOf
(
int8
(
8
)))
case
Int16
:
v
.
Set
(
NewValue
(
int16
(
16
)))
v
.
Set
(
ValueOf
(
int16
(
16
)))
case
Int32
:
v
.
Set
(
NewValue
(
int32
(
32
)))
v
.
Set
(
ValueOf
(
int32
(
32
)))
case
Int64
:
v
.
Set
(
NewValue
(
int64
(
64
)))
v
.
Set
(
ValueOf
(
int64
(
64
)))
case
Uint
:
v
.
Set
(
NewValue
(
uint
(
132
)))
v
.
Set
(
ValueOf
(
uint
(
132
)))
case
Uint8
:
v
.
Set
(
NewValue
(
uint8
(
8
)))
v
.
Set
(
ValueOf
(
uint8
(
8
)))
case
Uint16
:
v
.
Set
(
NewValue
(
uint16
(
16
)))
v
.
Set
(
ValueOf
(
uint16
(
16
)))
case
Uint32
:
v
.
Set
(
NewValue
(
uint32
(
32
)))
v
.
Set
(
ValueOf
(
uint32
(
32
)))
case
Uint64
:
v
.
Set
(
NewValue
(
uint64
(
64
)))
v
.
Set
(
ValueOf
(
uint64
(
64
)))
case
Float32
:
v
.
Set
(
NewValue
(
float32
(
256.25
)))
v
.
Set
(
ValueOf
(
float32
(
256.25
)))
case
Float64
:
v
.
Set
(
NewValue
(
512.125
))
v
.
Set
(
ValueOf
(
512.125
))
case
Complex64
:
v
.
Set
(
NewValue
(
complex64
(
532.125
+
10i
)))
v
.
Set
(
ValueOf
(
complex64
(
532.125
+
10i
)))
case
Complex128
:
v
.
Set
(
NewValue
(
complex128
(
564.25
+
1i
)))
v
.
Set
(
ValueOf
(
complex128
(
564.25
+
1i
)))
case
String
:
v
.
Set
(
NewValue
(
"stringy cheese"
))
v
.
Set
(
ValueOf
(
"stringy cheese"
))
case
Bool
:
v
.
Set
(
NewValue
(
true
))
v
.
Set
(
ValueOf
(
true
))
}
s
:=
valueToString
(
v
)
if
s
!=
tt
.
s
{
...
...
@@ -318,7 +318,7 @@ var valueToStringTests = []pair{
func
TestValueToString
(
t
*
testing
.
T
)
{
for
i
,
test
:=
range
valueToStringTests
{
s
:=
valueToString
(
NewValue
(
test
.
i
))
s
:=
valueToString
(
ValueOf
(
test
.
i
))
if
s
!=
test
.
s
{
t
.
Errorf
(
"#%d: have %#q, want %#q"
,
i
,
s
,
test
.
s
)
}
...
...
@@ -326,7 +326,7 @@ func TestValueToString(t *testing.T) {
}
func
TestArrayElemSet
(
t
*
testing
.
T
)
{
v
:=
NewValue
(
&
[
10
]
int
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
})
.
Elem
()
v
:=
ValueOf
(
&
[
10
]
int
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
})
.
Elem
()
v
.
Index
(
4
)
.
SetInt
(
123
)
s
:=
valueToString
(
v
)
const
want
=
"[10]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
...
...
@@ -334,7 +334,7 @@ func TestArrayElemSet(t *testing.T) {
t
.
Errorf
(
"[10]int: have %#q want %#q"
,
s
,
want
)
}
v
=
NewValue
([]
int
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
})
v
=
ValueOf
([]
int
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
10
})
v
.
Index
(
4
)
.
SetInt
(
123
)
s
=
valueToString
(
v
)
const
want1
=
"[]int{1, 2, 3, 4, 123, 6, 7, 8, 9, 10}"
...
...
@@ -346,15 +346,15 @@ func TestArrayElemSet(t *testing.T) {
func
TestPtrPointTo
(
t
*
testing
.
T
)
{
var
ip
*
int32
var
i
int32
=
1234
vip
:=
NewValue
(
&
ip
)
vi
:=
NewValue
(
&
i
)
.
Elem
()
vip
:=
ValueOf
(
&
ip
)
vi
:=
ValueOf
(
&
i
)
.
Elem
()
vip
.
Elem
()
.
Set
(
vi
.
Addr
())
if
*
ip
!=
1234
{
t
.
Errorf
(
"got %d, want 1234"
,
*
ip
)
}
ip
=
nil
vp
:=
NewValue
(
&
ip
)
.
Elem
()
vp
:=
ValueOf
(
&
ip
)
.
Elem
()
vp
.
Set
(
Zero
(
vp
.
Type
()))
if
ip
!=
nil
{
t
.
Errorf
(
"got non-nil (%p), want nil"
,
ip
)
...
...
@@ -364,7 +364,7 @@ func TestPtrPointTo(t *testing.T) {
func
TestPtrSetNil
(
t
*
testing
.
T
)
{
var
i
int32
=
1234
ip
:=
&
i
vip
:=
NewValue
(
&
ip
)
vip
:=
ValueOf
(
&
ip
)
vip
.
Elem
()
.
Set
(
Zero
(
vip
.
Elem
()
.
Type
()))
if
ip
!=
nil
{
t
.
Errorf
(
"got non-nil (%d), want nil"
,
*
ip
)
...
...
@@ -373,7 +373,7 @@ func TestPtrSetNil(t *testing.T) {
func
TestMapSetNil
(
t
*
testing
.
T
)
{
m
:=
make
(
map
[
string
]
int
)
vm
:=
NewValue
(
&
m
)
vm
:=
ValueOf
(
&
m
)
vm
.
Elem
()
.
Set
(
Zero
(
vm
.
Elem
()
.
Type
()))
if
m
!=
nil
{
t
.
Errorf
(
"got non-nil (%p), want nil"
,
m
)
...
...
@@ -382,10 +382,10 @@ func TestMapSetNil(t *testing.T) {
func
TestAll
(
t
*
testing
.
T
)
{
testType
(
t
,
1
,
Type
o
f
((
int8
)(
0
)),
"int8"
)
testType
(
t
,
2
,
Type
o
f
((
*
int8
)(
nil
))
.
Elem
(),
"int8"
)
testType
(
t
,
1
,
Type
O
f
((
int8
)(
0
)),
"int8"
)
testType
(
t
,
2
,
Type
O
f
((
*
int8
)(
nil
))
.
Elem
(),
"int8"
)
typ
:=
Type
o
f
((
*
struct
{
typ
:=
Type
O
f
((
*
struct
{
c
chan
*
int32
d
float32
})(
nil
))
...
...
@@ -407,22 +407,22 @@ func TestAll(t *testing.T) {
t
.
Errorf
(
"FieldByName says absent field is present"
)
}
typ
=
Type
o
f
([
32
]
int32
{})
typ
=
Type
O
f
([
32
]
int32
{})
testType
(
t
,
7
,
typ
,
"[32]int32"
)
testType
(
t
,
8
,
typ
.
Elem
(),
"int32"
)
typ
=
Type
o
f
((
map
[
string
]
*
int32
)(
nil
))
typ
=
Type
O
f
((
map
[
string
]
*
int32
)(
nil
))
testType
(
t
,
9
,
typ
,
"map[string] *int32"
)
mtyp
:=
typ
testType
(
t
,
10
,
mtyp
.
Key
(),
"string"
)
testType
(
t
,
11
,
mtyp
.
Elem
(),
"*int32"
)
typ
=
Type
o
f
((
chan
<-
string
)(
nil
))
typ
=
Type
O
f
((
chan
<-
string
)(
nil
))
testType
(
t
,
12
,
typ
,
"chan<- string"
)
testType
(
t
,
13
,
typ
.
Elem
(),
"string"
)
// make sure tag strings are not part of element type
typ
=
Type
o
f
(
struct
{
typ
=
Type
O
f
(
struct
{
d
[]
uint32
"TAG"
}{})
.
Field
(
0
)
.
Type
testType
(
t
,
14
,
typ
,
"[]uint32"
)
...
...
@@ -433,11 +433,11 @@ func TestInterfaceGet(t *testing.T) {
E
interface
{}
}
inter
.
E
=
123.456
v1
:=
NewValue
(
&
inter
)
v1
:=
ValueOf
(
&
inter
)
v2
:=
v1
.
Elem
()
.
Field
(
0
)
assert
(
t
,
v2
.
Type
()
.
String
(),
"interface { }"
)
i2
:=
v2
.
Interface
()
v3
:=
NewValue
(
i2
)
v3
:=
ValueOf
(
i2
)
assert
(
t
,
v3
.
Type
()
.
String
(),
"float64"
)
}
...
...
@@ -446,7 +446,7 @@ func TestInterfaceValue(t *testing.T) {
E
interface
{}
}
inter
.
E
=
123.456
v1
:=
NewValue
(
&
inter
)
v1
:=
ValueOf
(
&
inter
)
v2
:=
v1
.
Elem
()
.
Field
(
0
)
assert
(
t
,
v2
.
Type
()
.
String
(),
"interface { }"
)
v3
:=
v2
.
Elem
()
...
...
@@ -454,13 +454,13 @@ func TestInterfaceValue(t *testing.T) {
i3
:=
v2
.
Interface
()
if
_
,
ok
:=
i3
.
(
float64
);
!
ok
{
t
.
Error
(
"v2.Interface() did not return float64, got "
,
Type
o
f
(
i3
))
t
.
Error
(
"v2.Interface() did not return float64, got "
,
Type
O
f
(
i3
))
}
}
func
TestFunctionValue
(
t
*
testing
.
T
)
{
var
x
interface
{}
=
func
()
{}
v
:=
NewValue
(
x
)
v
:=
ValueOf
(
x
)
if
v
.
Interface
()
!=
v
.
Interface
()
||
v
.
Interface
()
!=
x
{
t
.
Fatalf
(
"TestFunction != itself"
)
}
...
...
@@ -493,12 +493,12 @@ func TestAppend(t *testing.T) {
// Convert extra from []int to []Value.
e0
:=
make
([]
Value
,
len
(
test
.
extra
))
for
j
,
e
:=
range
test
.
extra
{
e0
[
j
]
=
NewValue
(
e
)
e0
[
j
]
=
ValueOf
(
e
)
}
// Convert extra from []int to *SliceValue.
e1
:=
NewValue
(
test
.
extra
)
e1
:=
ValueOf
(
test
.
extra
)
// Test Append.
a0
:=
NewValue
(
test
.
orig
)
a0
:=
ValueOf
(
test
.
orig
)
have0
:=
Append
(
a0
,
e0
...
)
.
Interface
()
.
([]
int
)
if
!
sameInts
(
have0
,
want
)
{
t
.
Errorf
(
"Append #%d: have %v, want %v (%p %p)"
,
i
,
have0
,
want
,
test
.
orig
,
have0
)
...
...
@@ -511,7 +511,7 @@ func TestAppend(t *testing.T) {
t
.
Errorf
(
"Append #%d extraLen: have %v, want %v"
,
i
,
len
(
test
.
extra
),
extraLen
)
}
// Test AppendSlice.
a1
:=
NewValue
(
test
.
orig
)
a1
:=
ValueOf
(
test
.
orig
)
have1
:=
AppendSlice
(
a1
,
e1
)
.
Interface
()
.
([]
int
)
if
!
sameInts
(
have1
,
want
)
{
t
.
Errorf
(
"AppendSlice #%d: have %v, want %v"
,
i
,
have1
,
want
)
...
...
@@ -537,8 +537,8 @@ func TestCopy(t *testing.T) {
}
a1
:=
a
b1
:=
b
aa
:=
NewValue
(
&
a1
)
.
Elem
()
ab
:=
NewValue
(
&
b1
)
.
Elem
()
aa
:=
ValueOf
(
&
a1
)
.
Elem
()
ab
:=
ValueOf
(
&
b1
)
.
Elem
()
for
tocopy
:=
1
;
tocopy
<=
7
;
tocopy
++
{
aa
.
SetLen
(
tocopy
)
Copy
(
ab
,
aa
)
...
...
@@ -567,12 +567,12 @@ func TestCopy(t *testing.T) {
func
TestBigUnnamedStruct
(
t
*
testing
.
T
)
{
b
:=
struct
{
a
,
b
,
c
,
d
int64
}{
1
,
2
,
3
,
4
}
v
:=
NewValue
(
b
)
v
:=
ValueOf
(
b
)
b1
:=
v
.
Interface
()
.
(
struct
{
a
,
b
,
c
,
d
int64
})
if
b1
.
a
!=
b
.
a
||
b1
.
b
!=
b
.
b
||
b1
.
c
!=
b
.
c
||
b1
.
d
!=
b
.
d
{
t
.
Errorf
(
"
NewValue
(%v).Interface().(*Big) = %v"
,
b
,
b1
)
t
.
Errorf
(
"
ValueOf
(%v).Interface().(*Big) = %v"
,
b
,
b1
)
}
}
...
...
@@ -582,10 +582,10 @@ type big struct {
func
TestBigStruct
(
t
*
testing
.
T
)
{
b
:=
big
{
1
,
2
,
3
,
4
,
5
}
v
:=
NewValue
(
b
)
v
:=
ValueOf
(
b
)
b1
:=
v
.
Interface
()
.
(
big
)
if
b1
.
a
!=
b
.
a
||
b1
.
b
!=
b
.
b
||
b1
.
c
!=
b
.
c
||
b1
.
d
!=
b
.
d
||
b1
.
e
!=
b
.
e
{
t
.
Errorf
(
"
NewValue
(%v).Interface().(big) = %v"
,
b
,
b1
)
t
.
Errorf
(
"
ValueOf
(%v).Interface().(big) = %v"
,
b
,
b1
)
}
}
...
...
@@ -649,15 +649,15 @@ func TestDeepEqual(t *testing.T) {
}
}
func
TestType
o
f
(
t
*
testing
.
T
)
{
func
TestType
O
f
(
t
*
testing
.
T
)
{
for
_
,
test
:=
range
deepEqualTests
{
v
:=
NewValue
(
test
.
a
)
v
:=
ValueOf
(
test
.
a
)
if
!
v
.
IsValid
()
{
continue
}
typ
:=
Type
o
f
(
test
.
a
)
typ
:=
Type
O
f
(
test
.
a
)
if
typ
!=
v
.
Type
()
{
t
.
Errorf
(
"Type
of(%v) = %v, but NewValue
(%v).Type() = %v"
,
test
.
a
,
typ
,
test
.
a
,
v
.
Type
())
t
.
Errorf
(
"Type
Of(%v) = %v, but ValueOf
(%v).Type() = %v"
,
test
.
a
,
typ
,
test
.
a
,
v
.
Type
())
}
}
}
...
...
@@ -707,7 +707,7 @@ func TestDeepEqualComplexStructInequality(t *testing.T) {
func
check2ndField
(
x
interface
{},
offs
uintptr
,
t
*
testing
.
T
)
{
s
:=
NewValue
(
x
)
s
:=
ValueOf
(
x
)
f
:=
s
.
Type
()
.
Field
(
1
)
if
f
.
Offset
!=
offs
{
t
.
Error
(
"mismatched offsets in structure alignment:"
,
f
.
Offset
,
offs
)
...
...
@@ -740,16 +740,16 @@ func TestAlignment(t *testing.T) {
}
func
Nil
(
a
interface
{},
t
*
testing
.
T
)
{
n
:=
NewValue
(
a
)
.
Field
(
0
)
n
:=
ValueOf
(
a
)
.
Field
(
0
)
if
!
n
.
IsNil
()
{
t
.
Errorf
(
"%v should be nil"
,
a
)
}
}
func
NotNil
(
a
interface
{},
t
*
testing
.
T
)
{
n
:=
NewValue
(
a
)
.
Field
(
0
)
n
:=
ValueOf
(
a
)
.
Field
(
0
)
if
n
.
IsNil
()
{
t
.
Errorf
(
"value of type %v should not be nil"
,
NewValue
(
a
)
.
Type
()
.
String
())
t
.
Errorf
(
"value of type %v should not be nil"
,
ValueOf
(
a
)
.
Type
()
.
String
())
}
}
...
...
@@ -765,7 +765,7 @@ func TestIsNil(t *testing.T) {
struct
{
x
[]
string
}{},
}
for
_
,
ts
:=
range
doNil
{
ty
:=
Type
o
f
(
ts
)
.
Field
(
0
)
.
Type
ty
:=
Type
O
f
(
ts
)
.
Field
(
0
)
.
Type
v
:=
Zero
(
ty
)
v
.
IsNil
()
// panics if not okay to call
}
...
...
@@ -820,7 +820,7 @@ func TestInterfaceExtraction(t *testing.T) {
}
s
.
w
=
os
.
Stdout
v
:=
Indirect
(
NewValue
(
&
s
))
.
Field
(
0
)
.
Interface
()
v
:=
Indirect
(
ValueOf
(
&
s
))
.
Field
(
0
)
.
Interface
()
if
v
!=
s
.
w
.
(
interface
{})
{
t
.
Error
(
"Interface() on interface: "
,
v
,
s
.
w
)
}
...
...
@@ -828,14 +828,14 @@ func TestInterfaceExtraction(t *testing.T) {
func
TestNilPtrValueSub
(
t
*
testing
.
T
)
{
var
pi
*
int
if
pv
:=
NewValue
(
pi
);
pv
.
Elem
()
.
IsValid
()
{
t
.
Error
(
"
NewValue
((*int)(nil)).Elem().IsValid()"
)
if
pv
:=
ValueOf
(
pi
);
pv
.
Elem
()
.
IsValid
()
{
t
.
Error
(
"
ValueOf
((*int)(nil)).Elem().IsValid()"
)
}
}
func
TestMap
(
t
*
testing
.
T
)
{
m
:=
map
[
string
]
int
{
"a"
:
1
,
"b"
:
2
}
mv
:=
NewValue
(
m
)
mv
:=
ValueOf
(
m
)
if
n
:=
mv
.
Len
();
n
!=
len
(
m
)
{
t
.
Errorf
(
"Len = %d, want %d"
,
n
,
len
(
m
))
}
...
...
@@ -855,15 +855,15 @@ func TestMap(t *testing.T) {
i
++
// Check that value lookup is correct.
vv
:=
mv
.
MapIndex
(
NewValue
(
k
))
vv
:=
mv
.
MapIndex
(
ValueOf
(
k
))
if
vi
:=
vv
.
Int
();
vi
!=
int64
(
v
)
{
t
.
Errorf
(
"Key %q: have value %d, want %d"
,
k
,
vi
,
v
)
}
// Copy into new map.
newmap
.
SetMapIndex
(
NewValue
(
k
),
NewValue
(
v
))
newmap
.
SetMapIndex
(
ValueOf
(
k
),
ValueOf
(
v
))
}
vv
:=
mv
.
MapIndex
(
NewValue
(
"not-present"
))
vv
:=
mv
.
MapIndex
(
ValueOf
(
"not-present"
))
if
vv
.
IsValid
()
{
t
.
Errorf
(
"Invalid key: got non-nil value %s"
,
valueToString
(
vv
))
}
...
...
@@ -880,13 +880,13 @@ func TestMap(t *testing.T) {
}
}
newmap
.
SetMapIndex
(
NewValue
(
"a"
),
Value
{})
newmap
.
SetMapIndex
(
ValueOf
(
"a"
),
Value
{})
v
,
ok
:=
newm
[
"a"
]
if
ok
{
t
.
Errorf
(
"newm[
\"
a
\"
] = %d after delete"
,
v
)
}
mv
=
NewValue
(
&
m
)
.
Elem
()
mv
=
ValueOf
(
&
m
)
.
Elem
()
mv
.
Set
(
Zero
(
mv
.
Type
()))
if
m
!=
nil
{
t
.
Errorf
(
"mv.Set(nil) failed"
)
...
...
@@ -902,14 +902,14 @@ func TestChan(t *testing.T) {
switch
loop
{
case
1
:
c
=
make
(
chan
int
,
1
)
cv
=
NewValue
(
c
)
cv
=
ValueOf
(
c
)
case
0
:
cv
=
MakeChan
(
Type
o
f
(
c
),
1
)
cv
=
MakeChan
(
Type
O
f
(
c
),
1
)
c
=
cv
.
Interface
()
.
(
chan
int
)
}
// Send
cv
.
Send
(
NewValue
(
2
))
cv
.
Send
(
ValueOf
(
2
))
if
i
:=
<-
c
;
i
!=
2
{
t
.
Errorf
(
"reflect Send 2, native recv %d"
,
i
)
}
...
...
@@ -937,14 +937,14 @@ func TestChan(t *testing.T) {
// TrySend fail
c
<-
100
ok
=
cv
.
TrySend
(
NewValue
(
5
))
ok
=
cv
.
TrySend
(
ValueOf
(
5
))
i
:=
<-
c
if
ok
{
t
.
Errorf
(
"TrySend on full chan succeeded: value %d"
,
i
)
}
// TrySend success
ok
=
cv
.
TrySend
(
NewValue
(
6
))
ok
=
cv
.
TrySend
(
ValueOf
(
6
))
if
!
ok
{
t
.
Errorf
(
"TrySend on empty chan failed"
)
}
else
{
...
...
@@ -966,9 +966,9 @@ func TestChan(t *testing.T) {
// check creation of unbuffered channel
var
c
chan
int
cv
:=
MakeChan
(
Type
o
f
(
c
),
0
)
cv
:=
MakeChan
(
Type
O
f
(
c
),
0
)
c
=
cv
.
Interface
()
.
(
chan
int
)
if
cv
.
TrySend
(
NewValue
(
7
))
{
if
cv
.
TrySend
(
ValueOf
(
7
))
{
t
.
Errorf
(
"TrySend on sync chan succeeded"
)
}
if
v
,
ok
:=
cv
.
TryRecv
();
v
.
IsValid
()
||
ok
{
...
...
@@ -976,7 +976,7 @@ func TestChan(t *testing.T) {
}
// len/cap
cv
=
MakeChan
(
Type
o
f
(
c
),
10
)
cv
=
MakeChan
(
Type
O
f
(
c
),
10
)
c
=
cv
.
Interface
()
.
(
chan
int
)
for
i
:=
0
;
i
<
3
;
i
++
{
c
<-
i
...
...
@@ -994,7 +994,7 @@ func dummy(b byte, c int, d byte) (i byte, j int, k byte) {
}
func
TestFunc
(
t
*
testing
.
T
)
{
ret
:=
NewValue
(
dummy
)
.
Call
([]
Value
{
NewValue
(
byte
(
10
)),
NewValue
(
20
),
NewValue
(
byte
(
30
))})
ret
:=
ValueOf
(
dummy
)
.
Call
([]
Value
{
ValueOf
(
byte
(
10
)),
ValueOf
(
20
),
ValueOf
(
byte
(
30
))})
if
len
(
ret
)
!=
3
{
t
.
Fatalf
(
"Call returned %d values, want 3"
,
len
(
ret
))
}
...
...
@@ -1019,39 +1019,39 @@ func (p Point) Dist(scale int) int {
func
TestMethod
(
t
*
testing
.
T
)
{
// Non-curried method of type.
p
:=
Point
{
3
,
4
}
i
:=
Type
of
(
p
)
.
Method
(
0
)
.
Func
.
Call
([]
Value
{
NewValue
(
p
),
NewValue
(
10
)})[
0
]
.
Int
()
i
:=
Type
Of
(
p
)
.
Method
(
0
)
.
Func
.
Call
([]
Value
{
ValueOf
(
p
),
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Type Method returned %d; want 250"
,
i
)
}
i
=
Type
of
(
&
p
)
.
Method
(
0
)
.
Func
.
Call
([]
Value
{
NewValue
(
&
p
),
NewValue
(
10
)})[
0
]
.
Int
()
i
=
Type
Of
(
&
p
)
.
Method
(
0
)
.
Func
.
Call
([]
Value
{
ValueOf
(
&
p
),
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Pointer Type Method returned %d; want 250"
,
i
)
}
// Curried method of value.
i
=
NewValue
(
p
)
.
Method
(
0
)
.
Call
([]
Value
{
NewValue
(
10
)})[
0
]
.
Int
()
i
=
ValueOf
(
p
)
.
Method
(
0
)
.
Call
([]
Value
{
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Value Method returned %d; want 250"
,
i
)
}
// Curried method of pointer.
i
=
NewValue
(
&
p
)
.
Method
(
0
)
.
Call
([]
Value
{
NewValue
(
10
)})[
0
]
.
Int
()
i
=
ValueOf
(
&
p
)
.
Method
(
0
)
.
Call
([]
Value
{
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Value Method returned %d; want 250"
,
i
)
}
// Curried method of interface value.
// Have to wrap interface value in a struct to get at it.
// Passing it to
NewValue
directly would
// Passing it to
ValueOf
directly would
// access the underlying Point, not the interface.
var
s
=
struct
{
X
interface
{
Dist
(
int
)
int
}
}{
p
}
pv
:=
NewValue
(
s
)
.
Field
(
0
)
i
=
pv
.
Method
(
0
)
.
Call
([]
Value
{
NewValue
(
10
)})[
0
]
.
Int
()
pv
:=
ValueOf
(
s
)
.
Field
(
0
)
i
=
pv
.
Method
(
0
)
.
Call
([]
Value
{
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Interface Method returned %d; want 250"
,
i
)
}
...
...
@@ -1066,19 +1066,19 @@ func TestInterfaceSet(t *testing.T) {
Dist
(
int
)
int
}
}
sv
:=
NewValue
(
&
s
)
.
Elem
()
sv
.
Field
(
0
)
.
Set
(
NewValue
(
p
))
sv
:=
ValueOf
(
&
s
)
.
Elem
()
sv
.
Field
(
0
)
.
Set
(
ValueOf
(
p
))
if
q
:=
s
.
I
.
(
*
Point
);
q
!=
p
{
t
.
Errorf
(
"i: have %p want %p"
,
q
,
p
)
}
pv
:=
sv
.
Field
(
1
)
pv
.
Set
(
NewValue
(
p
))
pv
.
Set
(
ValueOf
(
p
))
if
q
:=
s
.
P
.
(
*
Point
);
q
!=
p
{
t
.
Errorf
(
"i: have %p want %p"
,
q
,
p
)
}
i
:=
pv
.
Method
(
0
)
.
Call
([]
Value
{
NewValue
(
10
)})[
0
]
.
Int
()
i
:=
pv
.
Method
(
0
)
.
Call
([]
Value
{
ValueOf
(
10
)})[
0
]
.
Int
()
if
i
!=
250
{
t
.
Errorf
(
"Interface Method returned %d; want 250"
,
i
)
}
...
...
@@ -1093,7 +1093,7 @@ func TestAnonymousFields(t *testing.T) {
var
field
StructField
var
ok
bool
var
t1
T1
type1
:=
Type
o
f
(
t1
)
type1
:=
Type
O
f
(
t1
)
if
field
,
ok
=
type1
.
FieldByName
(
"int"
);
!
ok
{
t
.
Error
(
"no field 'int'"
)
}
...
...
@@ -1177,7 +1177,7 @@ var fieldTests = []FTest{
func
TestFieldByIndex
(
t
*
testing
.
T
)
{
for
_
,
test
:=
range
fieldTests
{
s
:=
Type
o
f
(
test
.
s
)
s
:=
Type
O
f
(
test
.
s
)
f
:=
s
.
FieldByIndex
(
test
.
index
)
if
f
.
Name
!=
""
{
if
test
.
index
!=
nil
{
...
...
@@ -1192,7 +1192,7 @@ func TestFieldByIndex(t *testing.T) {
}
if
test
.
value
!=
0
{
v
:=
NewValue
(
test
.
s
)
.
FieldByIndex
(
test
.
index
)
v
:=
ValueOf
(
test
.
s
)
.
FieldByIndex
(
test
.
index
)
if
v
.
IsValid
()
{
if
x
,
ok
:=
v
.
Interface
()
.
(
int
);
ok
{
if
x
!=
test
.
value
{
...
...
@@ -1210,7 +1210,7 @@ func TestFieldByIndex(t *testing.T) {
func
TestFieldByName
(
t
*
testing
.
T
)
{
for
_
,
test
:=
range
fieldTests
{
s
:=
Type
o
f
(
test
.
s
)
s
:=
Type
O
f
(
test
.
s
)
f
,
found
:=
s
.
FieldByName
(
test
.
name
)
if
found
{
if
test
.
index
!=
nil
{
...
...
@@ -1232,7 +1232,7 @@ func TestFieldByName(t *testing.T) {
}
if
test
.
value
!=
0
{
v
:=
NewValue
(
test
.
s
)
.
FieldByName
(
test
.
name
)
v
:=
ValueOf
(
test
.
s
)
.
FieldByName
(
test
.
name
)
if
v
.
IsValid
()
{
if
x
,
ok
:=
v
.
Interface
()
.
(
int
);
ok
{
if
x
!=
test
.
value
{
...
...
@@ -1249,19 +1249,19 @@ func TestFieldByName(t *testing.T) {
}
func
TestImportPath
(
t
*
testing
.
T
)
{
if
path
:=
Type
o
f
(
vector
.
Vector
{})
.
PkgPath
();
path
!=
"container/vector"
{
t
.
Errorf
(
"Type
o
f(vector.Vector{}).PkgPath() = %q, want
\"
container/vector
\"
"
,
path
)
if
path
:=
Type
O
f
(
vector
.
Vector
{})
.
PkgPath
();
path
!=
"container/vector"
{
t
.
Errorf
(
"Type
O
f(vector.Vector{}).PkgPath() = %q, want
\"
container/vector
\"
"
,
path
)
}
}
func
TestDotDotDot
(
t
*
testing
.
T
)
{
// Test example from FuncType.DotDotDot documentation.
var
f
func
(
x
int
,
y
...
float64
)
typ
:=
Type
o
f
(
f
)
if
typ
.
NumIn
()
==
2
&&
typ
.
In
(
0
)
==
Type
o
f
(
int
(
0
))
{
typ
:=
Type
O
f
(
f
)
if
typ
.
NumIn
()
==
2
&&
typ
.
In
(
0
)
==
Type
O
f
(
int
(
0
))
{
sl
:=
typ
.
In
(
1
)
if
sl
.
Kind
()
==
Slice
{
if
sl
.
Elem
()
==
Type
o
f
(
0.0
)
{
if
sl
.
Elem
()
==
Type
O
f
(
0.0
)
{
// ok
return
}
...
...
@@ -1290,8 +1290,8 @@ func (*inner) m() {}
func
(
*
outer
)
m
()
{}
func
TestNestedMethods
(
t
*
testing
.
T
)
{
typ
:=
Type
o
f
((
*
outer
)(
nil
))
if
typ
.
NumMethod
()
!=
1
||
typ
.
Method
(
0
)
.
Func
.
Pointer
()
!=
NewValue
((
*
outer
)
.
m
)
.
Pointer
()
{
typ
:=
Type
O
f
((
*
outer
)(
nil
))
if
typ
.
NumMethod
()
!=
1
||
typ
.
Method
(
0
)
.
Func
.
Pointer
()
!=
ValueOf
((
*
outer
)
.
m
)
.
Pointer
()
{
t
.
Errorf
(
"Wrong method table for outer: (m=%p)"
,
(
*
outer
)
.
m
)
for
i
:=
0
;
i
<
typ
.
NumMethod
();
i
++
{
m
:=
typ
.
Method
(
i
)
...
...
@@ -1314,8 +1314,8 @@ func (i *InnerInt) M() int {
}
func
TestEmbeddedMethods
(
t
*
testing
.
T
)
{
typ
:=
Type
o
f
((
*
OuterInt
)(
nil
))
if
typ
.
NumMethod
()
!=
1
||
typ
.
Method
(
0
)
.
Func
.
Pointer
()
!=
NewValue
((
*
OuterInt
)
.
M
)
.
Pointer
()
{
typ
:=
Type
O
f
((
*
OuterInt
)(
nil
))
if
typ
.
NumMethod
()
!=
1
||
typ
.
Method
(
0
)
.
Func
.
Pointer
()
!=
ValueOf
((
*
OuterInt
)
.
M
)
.
Pointer
()
{
t
.
Errorf
(
"Wrong method table for OuterInt: (m=%p)"
,
(
*
OuterInt
)
.
M
)
for
i
:=
0
;
i
<
typ
.
NumMethod
();
i
++
{
m
:=
typ
.
Method
(
i
)
...
...
@@ -1324,12 +1324,12 @@ func TestEmbeddedMethods(t *testing.T) {
}
i
:=
&
InnerInt
{
3
}
if
v
:=
NewValue
(
i
)
.
Method
(
0
)
.
Call
(
nil
)[
0
]
.
Int
();
v
!=
3
{
if
v
:=
ValueOf
(
i
)
.
Method
(
0
)
.
Call
(
nil
)[
0
]
.
Int
();
v
!=
3
{
t
.
Errorf
(
"i.M() = %d, want 3"
,
v
)
}
o
:=
&
OuterInt
{
1
,
InnerInt
{
2
}}
if
v
:=
NewValue
(
o
)
.
Method
(
0
)
.
Call
(
nil
)[
0
]
.
Int
();
v
!=
2
{
if
v
:=
ValueOf
(
o
)
.
Method
(
0
)
.
Call
(
nil
)[
0
]
.
Int
();
v
!=
2
{
t
.
Errorf
(
"i.M() = %d, want 2"
,
v
)
}
...
...
@@ -1342,15 +1342,15 @@ func TestEmbeddedMethods(t *testing.T) {
func
TestPtrTo
(
t
*
testing
.
T
)
{
var
i
int
typ
:=
Type
o
f
(
i
)
typ
:=
Type
O
f
(
i
)
for
i
=
0
;
i
<
100
;
i
++
{
typ
=
PtrTo
(
typ
)
}
for
i
=
0
;
i
<
100
;
i
++
{
typ
=
typ
.
Elem
()
}
if
typ
!=
Type
o
f
(
i
)
{
t
.
Errorf
(
"after 100 PtrTo and Elem, have %s, want %s"
,
typ
,
Type
o
f
(
i
))
if
typ
!=
Type
O
f
(
i
)
{
t
.
Errorf
(
"after 100 PtrTo and Elem, have %s, want %s"
,
typ
,
Type
O
f
(
i
))
}
}
...
...
@@ -1359,7 +1359,7 @@ func TestAddr(t *testing.T) {
X
,
Y
int
}
v
:=
NewValue
(
&
p
)
v
:=
ValueOf
(
&
p
)
v
=
v
.
Elem
()
v
=
v
.
Addr
()
v
=
v
.
Elem
()
...
...
@@ -1369,10 +1369,10 @@ func TestAddr(t *testing.T) {
t
.
Errorf
(
"Addr.Elem.Set failed to set value"
)
}
// Again but take address of the
NewValue
value.
// Again but take address of the
ValueOf
value.
// Exercises generation of PtrTypes not present in the binary.
q
:=
&
p
v
=
NewValue
(
&
q
)
.
Elem
()
v
=
ValueOf
(
&
q
)
.
Elem
()
v
=
v
.
Addr
()
v
=
v
.
Elem
()
v
=
v
.
Elem
()
...
...
@@ -1387,7 +1387,7 @@ func TestAddr(t *testing.T) {
// Starting without pointer we should get changed value
// in interface.
qq
:=
p
v
=
NewValue
(
&
qq
)
.
Elem
()
v
=
ValueOf
(
&
qq
)
.
Elem
()
v0
:=
v
v
=
v
.
Addr
()
v
=
v
.
Elem
()
...
...
@@ -1422,7 +1422,7 @@ func TestAllocations(t *testing.T) {
var
i
interface
{}
var
v
Value
i
=
42
+
j
v
=
NewValue
(
i
)
v
=
ValueOf
(
i
)
if
int
(
v
.
Int
())
!=
42
+
j
{
panic
(
"wrong int"
)
}
...
...
@@ -1431,7 +1431,7 @@ func TestAllocations(t *testing.T) {
func
TestSmallNegativeInt
(
t
*
testing
.
T
)
{
i
:=
int16
(
-
1
)
v
:=
NewValue
(
i
)
v
:=
ValueOf
(
i
)
if
v
.
Int
()
!=
-
1
{
t
.
Errorf
(
"int16(-1).Int() returned %v"
,
v
.
Int
())
}
...
...
@@ -1439,13 +1439,13 @@ func TestSmallNegativeInt(t *testing.T) {
func
TestSlice
(
t
*
testing
.
T
)
{
xs
:=
[]
int
{
1
,
2
,
3
,
4
,
5
,
6
,
7
,
8
}
v
:=
NewValue
(
xs
)
.
Slice
(
3
,
5
)
.
Interface
()
.
([]
int
)
v
:=
ValueOf
(
xs
)
.
Slice
(
3
,
5
)
.
Interface
()
.
([]
int
)
if
len
(
v
)
!=
2
||
v
[
0
]
!=
4
||
v
[
1
]
!=
5
{
t
.
Errorf
(
"xs.Slice(3, 5) = %v"
,
v
)
}
xa
:=
[
7
]
int
{
10
,
20
,
30
,
40
,
50
,
60
,
70
}
v
=
NewValue
(
&
xa
)
.
Elem
()
.
Slice
(
2
,
5
)
.
Interface
()
.
([]
int
)
v
=
ValueOf
(
&
xa
)
.
Elem
()
.
Slice
(
2
,
5
)
.
Interface
()
.
([]
int
)
if
len
(
v
)
!=
3
||
v
[
0
]
!=
30
||
v
[
1
]
!=
40
||
v
[
2
]
!=
50
{
t
.
Errorf
(
"xa.Slice(2, 5) = %v"
,
v
)
}
...
...
@@ -1453,7 +1453,7 @@ func TestSlice(t *testing.T) {
func
TestVariadic
(
t
*
testing
.
T
)
{
var
b
bytes
.
Buffer
V
:=
NewValue
V
:=
ValueOf
b
.
Reset
()
V
(
fmt
.
Fprintf
)
.
Call
([]
Value
{
V
(
&
b
),
V
(
"%s, %d world"
),
V
(
"hello"
),
V
(
42
)})
...
...
src/pkg/reflect/deepequal.go
View file @
0e2bb62f
...
...
@@ -117,8 +117,8 @@ func DeepEqual(a1, a2 interface{}) bool {
if
a1
==
nil
||
a2
==
nil
{
return
a1
==
a2
}
v1
:=
NewValue
(
a1
)
v2
:=
NewValue
(
a2
)
v1
:=
ValueOf
(
a1
)
v2
:=
ValueOf
(
a2
)
if
v1
.
Type
()
!=
v2
.
Type
()
{
return
false
}
...
...
src/pkg/reflect/set_test.go
View file @
0e2bb62f
...
...
@@ -20,82 +20,82 @@ func TestImplicitMapConversion(t *testing.T) {
{
// direct
m
:=
make
(
map
[
int
]
int
)
mv
:=
NewValue
(
m
)
mv
.
SetMapIndex
(
NewValue
(
1
),
NewValue
(
2
))
mv
:=
ValueOf
(
m
)
mv
.
SetMapIndex
(
ValueOf
(
1
),
ValueOf
(
2
))
x
,
ok
:=
m
[
1
]
if
x
!=
2
{
t
.
Errorf
(
"#1 after SetMapIndex(1,2): %d, %t (map=%v)"
,
x
,
ok
,
m
)
}
if
n
:=
mv
.
MapIndex
(
NewValue
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
if
n
:=
mv
.
MapIndex
(
ValueOf
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
t
.
Errorf
(
"#1 MapIndex(1) = %d"
,
n
)
}
}
{
// convert interface key
m
:=
make
(
map
[
interface
{}]
int
)
mv
:=
NewValue
(
m
)
mv
.
SetMapIndex
(
NewValue
(
1
),
NewValue
(
2
))
mv
:=
ValueOf
(
m
)
mv
.
SetMapIndex
(
ValueOf
(
1
),
ValueOf
(
2
))
x
,
ok
:=
m
[
1
]
if
x
!=
2
{
t
.
Errorf
(
"#2 after SetMapIndex(1,2): %d, %t (map=%v)"
,
x
,
ok
,
m
)
}
if
n
:=
mv
.
MapIndex
(
NewValue
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
if
n
:=
mv
.
MapIndex
(
ValueOf
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
t
.
Errorf
(
"#2 MapIndex(1) = %d"
,
n
)
}
}
{
// convert interface value
m
:=
make
(
map
[
int
]
interface
{})
mv
:=
NewValue
(
m
)
mv
.
SetMapIndex
(
NewValue
(
1
),
NewValue
(
2
))
mv
:=
ValueOf
(
m
)
mv
.
SetMapIndex
(
ValueOf
(
1
),
ValueOf
(
2
))
x
,
ok
:=
m
[
1
]
if
x
!=
2
{
t
.
Errorf
(
"#3 after SetMapIndex(1,2): %d, %t (map=%v)"
,
x
,
ok
,
m
)
}
if
n
:=
mv
.
MapIndex
(
NewValue
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
if
n
:=
mv
.
MapIndex
(
ValueOf
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
t
.
Errorf
(
"#3 MapIndex(1) = %d"
,
n
)
}
}
{
// convert both interface key and interface value
m
:=
make
(
map
[
interface
{}]
interface
{})
mv
:=
NewValue
(
m
)
mv
.
SetMapIndex
(
NewValue
(
1
),
NewValue
(
2
))
mv
:=
ValueOf
(
m
)
mv
.
SetMapIndex
(
ValueOf
(
1
),
ValueOf
(
2
))
x
,
ok
:=
m
[
1
]
if
x
!=
2
{
t
.
Errorf
(
"#4 after SetMapIndex(1,2): %d, %t (map=%v)"
,
x
,
ok
,
m
)
}
if
n
:=
mv
.
MapIndex
(
NewValue
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
if
n
:=
mv
.
MapIndex
(
ValueOf
(
1
))
.
Interface
()
.
(
int
);
n
!=
2
{
t
.
Errorf
(
"#4 MapIndex(1) = %d"
,
n
)
}
}
{
// convert both, with non-empty interfaces
m
:=
make
(
map
[
io
.
Reader
]
io
.
Writer
)
mv
:=
NewValue
(
m
)
mv
:=
ValueOf
(
m
)
b1
:=
new
(
bytes
.
Buffer
)
b2
:=
new
(
bytes
.
Buffer
)
mv
.
SetMapIndex
(
NewValue
(
b1
),
NewValue
(
b2
))
mv
.
SetMapIndex
(
ValueOf
(
b1
),
ValueOf
(
b2
))
x
,
ok
:=
m
[
b1
]
if
x
!=
b2
{
t
.
Errorf
(
"#5 after SetMapIndex(b1, b2): %p (!= %p), %t (map=%v)"
,
x
,
b2
,
ok
,
m
)
}
if
p
:=
mv
.
MapIndex
(
NewValue
(
b1
))
.
Elem
()
.
Pointer
();
p
!=
uintptr
(
unsafe
.
Pointer
(
b2
))
{
if
p
:=
mv
.
MapIndex
(
ValueOf
(
b1
))
.
Elem
()
.
Pointer
();
p
!=
uintptr
(
unsafe
.
Pointer
(
b2
))
{
t
.
Errorf
(
"#5 MapIndex(b1) = %p want %p"
,
p
,
b2
)
}
}
{
// convert channel direction
m
:=
make
(
map
[
<-
chan
int
]
chan
int
)
mv
:=
NewValue
(
m
)
mv
:=
ValueOf
(
m
)
c1
:=
make
(
chan
int
)
c2
:=
make
(
chan
int
)
mv
.
SetMapIndex
(
NewValue
(
c1
),
NewValue
(
c2
))
mv
.
SetMapIndex
(
ValueOf
(
c1
),
ValueOf
(
c2
))
x
,
ok
:=
m
[
c1
]
if
x
!=
c2
{
t
.
Errorf
(
"#6 after SetMapIndex(c1, c2): %p (!= %p), %t (map=%v)"
,
x
,
c2
,
ok
,
m
)
}
if
p
:=
mv
.
MapIndex
(
NewValue
(
c1
))
.
Pointer
();
p
!=
NewValue
(
c2
)
.
Pointer
()
{
if
p
:=
mv
.
MapIndex
(
ValueOf
(
c1
))
.
Pointer
();
p
!=
ValueOf
(
c2
)
.
Pointer
()
{
t
.
Errorf
(
"#6 MapIndex(c1) = %p want %p"
,
p
,
c2
)
}
}
...
...
@@ -106,15 +106,15 @@ func TestImplicitMapConversion(t *testing.T) {
// when we do that though, so MyBuffer is defined
// at top level.
m
:=
make
(
map
[
*
MyBuffer
]
*
bytes
.
Buffer
)
mv
:=
NewValue
(
m
)
mv
:=
ValueOf
(
m
)
b1
:=
new
(
MyBuffer
)
b2
:=
new
(
bytes
.
Buffer
)
mv
.
SetMapIndex
(
NewValue
(
b1
),
NewValue
(
b2
))
mv
.
SetMapIndex
(
ValueOf
(
b1
),
ValueOf
(
b2
))
x
,
ok
:=
m
[
b1
]
if
x
!=
b2
{
t
.
Errorf
(
"#7 after SetMapIndex(b1, b2): %p (!= %p), %t (map=%v)"
,
x
,
b2
,
ok
,
m
)
}
if
p
:=
mv
.
MapIndex
(
NewValue
(
b1
))
.
Pointer
();
p
!=
uintptr
(
unsafe
.
Pointer
(
b2
))
{
if
p
:=
mv
.
MapIndex
(
ValueOf
(
b1
))
.
Pointer
();
p
!=
uintptr
(
unsafe
.
Pointer
(
b2
))
{
t
.
Errorf
(
"#7 MapIndex(b1) = %p want %p"
,
p
,
b2
)
}
}
...
...
@@ -126,8 +126,8 @@ func TestImplicitSetConversion(t *testing.T) {
// Just make sure conversions are being applied at all.
var
r
io
.
Reader
b
:=
new
(
bytes
.
Buffer
)
rv
:=
NewValue
(
&
r
)
.
Elem
()
rv
.
Set
(
NewValue
(
b
))
rv
:=
ValueOf
(
&
r
)
.
Elem
()
rv
.
Set
(
ValueOf
(
b
))
if
r
!=
b
{
t
.
Errorf
(
"after Set: r=%T(%v)"
,
r
,
r
)
}
...
...
@@ -136,7 +136,7 @@ func TestImplicitSetConversion(t *testing.T) {
func
TestImplicitSendConversion
(
t
*
testing
.
T
)
{
c
:=
make
(
chan
io
.
Reader
,
10
)
b
:=
new
(
bytes
.
Buffer
)
NewValue
(
c
)
.
Send
(
NewValue
(
b
))
ValueOf
(
c
)
.
Send
(
ValueOf
(
b
))
if
bb
:=
<-
c
;
bb
!=
b
{
t
.
Errorf
(
"Received %p != %p"
,
bb
,
b
)
}
...
...
@@ -144,9 +144,9 @@ func TestImplicitSendConversion(t *testing.T) {
func
TestImplicitCallConversion
(
t
*
testing
.
T
)
{
// Arguments must be assignable to parameter types.
fv
:=
NewValue
(
io
.
WriteString
)
fv
:=
ValueOf
(
io
.
WriteString
)
b
:=
new
(
bytes
.
Buffer
)
fv
.
Call
([]
Value
{
NewValue
(
b
),
NewValue
(
"hello world"
)})
fv
.
Call
([]
Value
{
ValueOf
(
b
),
ValueOf
(
"hello world"
)})
if
b
.
String
()
!=
"hello world"
{
t
.
Errorf
(
"After call: string=%q want %q"
,
b
.
String
(),
"hello world"
)
}
...
...
@@ -155,9 +155,9 @@ func TestImplicitCallConversion(t *testing.T) {
func
TestImplicitAppendConversion
(
t
*
testing
.
T
)
{
// Arguments must be assignable to the slice's element type.
s
:=
[]
io
.
Reader
{}
sv
:=
NewValue
(
&
s
)
.
Elem
()
sv
:=
ValueOf
(
&
s
)
.
Elem
()
b
:=
new
(
bytes
.
Buffer
)
sv
.
Set
(
Append
(
sv
,
NewValue
(
b
)))
sv
.
Set
(
Append
(
sv
,
ValueOf
(
b
)))
if
len
(
s
)
!=
1
||
s
[
0
]
!=
b
{
t
.
Errorf
(
"after append: s=%v want [%p]"
,
s
,
b
)
}
...
...
@@ -176,8 +176,8 @@ var implementsTests = []struct {
func
TestImplements
(
t
*
testing
.
T
)
{
for
_
,
tt
:=
range
implementsTests
{
xv
:=
Type
o
f
(
tt
.
x
)
.
Elem
()
xt
:=
Type
o
f
(
tt
.
t
)
.
Elem
()
xv
:=
Type
O
f
(
tt
.
x
)
.
Elem
()
xt
:=
Type
O
f
(
tt
.
t
)
.
Elem
()
if
b
:=
xv
.
Implements
(
xt
);
b
!=
tt
.
b
{
t
.
Errorf
(
"(%s).Implements(%s) = %v, want %v"
,
xv
.
String
(),
xt
.
String
(),
b
,
tt
.
b
)
}
...
...
@@ -202,8 +202,8 @@ type IntPtr1 *int
func
TestAssignableTo
(
t
*
testing
.
T
)
{
for
_
,
tt
:=
range
append
(
assignableTests
,
implementsTests
...
)
{
xv
:=
Type
o
f
(
tt
.
x
)
.
Elem
()
xt
:=
Type
o
f
(
tt
.
t
)
.
Elem
()
xv
:=
Type
O
f
(
tt
.
x
)
.
Elem
()
xt
:=
Type
O
f
(
tt
.
t
)
.
Elem
()
if
b
:=
xv
.
AssignableTo
(
xt
);
b
!=
tt
.
b
{
t
.
Errorf
(
"(%s).AssignableTo(%s) = %v, want %v"
,
xv
.
String
(),
xt
.
String
(),
b
,
tt
.
b
)
}
...
...
src/pkg/reflect/type.go
View file @
0e2bb62f
...
...
@@ -5,9 +5,9 @@
// Package reflect implements run-time reflection, allowing a program to
// manipulate objects with arbitrary types. The typical use is to take a value
// with static type interface{} and extract its dynamic type information by
// calling Type
o
f, which returns a Type.
// calling Type
O
f, which returns a Type.
//
// A call to
NewValue
returns a Value representing the run-time data.
// A call to
ValueOf
returns a Value representing the run-time data.
// Zero takes a Type and returns a Value representing a zero value
// for that type.
package
reflect
...
...
@@ -808,8 +808,8 @@ func toType(p *runtime.Type) Type {
return
toCommonType
(
p
)
.
toType
()
}
// Type
o
f returns the reflection Type of the value in the interface{}.
func
Type
o
f
(
i
interface
{})
Type
{
// Type
O
f returns the reflection Type of the value in the interface{}.
func
Type
O
f
(
i
interface
{})
Type
{
eface
:=
*
(
*
emptyInterface
)(
unsafe
.
Pointer
(
&
i
))
return
toType
(
eface
.
typ
)
}
...
...
src/pkg/reflect/value.go
View file @
0e2bb62f
...
...
@@ -1611,9 +1611,9 @@ func Indirect(v Value) Value {
return
v
.
Elem
()
}
//
NewValue
returns a new Value initialized to the concrete value
// stored in the interface i.
NewValue
(nil) returns the zero Value.
func
NewValue
(
i
interface
{})
Value
{
//
ValueOf
returns a new Value initialized to the concrete value
// stored in the interface i.
ValueOf
(nil) returns the zero Value.
func
ValueOf
(
i
interface
{})
Value
{
if
i
==
nil
{
return
Value
{}
}
...
...
@@ -1626,7 +1626,7 @@ func NewValue(i interface{}) Value {
// Zero returns a Value representing a zero value for the specified type.
// The result is different from the zero value of the Value struct,
// which represents no value at all.
// For example, Zero(Type
o
f(42)) returns a Value with Kind Int and value 0.
// For example, Zero(Type
O
f(42)) returns a Value with Kind Int and value 0.
func
Zero
(
typ
Type
)
Value
{
if
typ
==
nil
{
panic
(
"reflect: Zero(nil)"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment