reflect: fix Addr() indirect value/flags and add tests.

Этот коммит содержится в:
Damian Gryski 2023-03-12 17:11:27 -07:00 коммит произвёл Ayke
родитель 0e94553b26
коммит a52cad3825
2 изменённых файлов: 26 добавлений и 1 удалений

Просмотреть файл

@ -223,7 +223,7 @@ func (v Value) Addr() Value {
return Value{ return Value{
typecode: pointerTo(v.typecode), typecode: pointerTo(v.typecode),
value: unsafe.Pointer(&v.value), value: v.value,
flags: v.flags ^ valueFlagIndirect, flags: v.flags ^ valueFlagIndirect,
} }
} }

Просмотреть файл

@ -266,6 +266,31 @@ func TestNamedTypes(t *testing.T) {
} }
} }
func addrDecode(body interface{}) {
vbody := ValueOf(body)
ptr := vbody.Elem()
pptr := ptr.Addr()
addrSetInt(pptr.Interface())
}
func addrSetInt(intf interface{}) {
ptr := intf.(*uint64)
*ptr = 112358
}
func TestAddr(t *testing.T) {
var n uint64
addrDecode(&n)
if n != 112358 {
t.Errorf("Failed to set t=112358, got %v", n)
}
v := ValueOf(&n)
if got, want := v.Elem().Addr().CanAddr(), false; got != want {
t.Errorf("Elem.Addr.CanAddr=%v, want %v", got, want)
}
}
func equal[T comparable](a, b []T) bool { func equal[T comparable](a, b []T) bool {
if len(a) != len(b) { if len(a) != len(b) {
return false return false