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