reflect: add Value.UnsafePointer method
This was added in Go 1.18.
Этот коммит содержится в:
родитель
bb65c5ce2b
коммит
caf405b01d
3 изменённых файлов: 14 добавлений и 8 удалений
|
@ -76,7 +76,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
|
||||||
if v1.Len() != v2.Len() {
|
if v1.Len() != v2.Len() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if v1.Pointer() == v2.Pointer() {
|
if v1.UnsafePointer() == v2.UnsafePointer() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for i := 0; i < v1.Len(); i++ {
|
for i := 0; i < v1.Len(); i++ {
|
||||||
|
@ -91,7 +91,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
|
||||||
}
|
}
|
||||||
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
|
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
|
||||||
case Ptr:
|
case Ptr:
|
||||||
if v1.Pointer() == v2.Pointer() {
|
if v1.UnsafePointer() == v2.UnsafePointer() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
|
return deepValueEqual(v1.Elem(), v2.Elem(), visited)
|
||||||
|
@ -109,7 +109,7 @@ func deepValueEqual(v1, v2 Value, visited map[visit]struct{}) bool {
|
||||||
if v1.Len() != v2.Len() {
|
if v1.Len() != v2.Len() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if v1.Pointer() == v2.Pointer() {
|
if v1.UnsafePointer() == v2.UnsafePointer() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
for _, k := range v1.MapKeys() {
|
for _, k := range v1.MapKeys() {
|
||||||
|
|
|
@ -135,16 +135,22 @@ func (v Value) IsNil() bool {
|
||||||
// Pointer returns the underlying pointer of the given value for the following
|
// Pointer returns the underlying pointer of the given value for the following
|
||||||
// types: chan, map, pointer, unsafe.Pointer, slice, func.
|
// types: chan, map, pointer, unsafe.Pointer, slice, func.
|
||||||
func (v Value) Pointer() uintptr {
|
func (v Value) Pointer() uintptr {
|
||||||
|
return uintptr(v.UnsafePointer())
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnsafePointer returns the underlying pointer of the given value for the
|
||||||
|
// following types: chan, map, pointer, unsafe.Pointer, slice, func.
|
||||||
|
func (v Value) UnsafePointer() unsafe.Pointer {
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
case Chan, Map, Ptr, UnsafePointer:
|
case Chan, Map, Ptr, UnsafePointer:
|
||||||
return uintptr(v.pointer())
|
return v.pointer()
|
||||||
case Slice:
|
case Slice:
|
||||||
slice := (*sliceHeader)(v.value)
|
slice := (*sliceHeader)(v.value)
|
||||||
return uintptr(slice.data)
|
return slice.data
|
||||||
case Func:
|
case Func:
|
||||||
panic("unimplemented: (reflect.Value).Pointer()")
|
panic("unimplemented: (reflect.Value).UnsafePointer()")
|
||||||
default: // not implemented: Func
|
default: // not implemented: Func
|
||||||
panic(&ValueError{Method: "Pointer"})
|
panic(&ValueError{Method: "UnsafePointer"})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ func reflectValueEqual(x, y reflect.Value) bool {
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
return x.String() == y.String()
|
return x.String() == y.String()
|
||||||
case reflect.Chan, reflect.Ptr, reflect.UnsafePointer:
|
case reflect.Chan, reflect.Ptr, reflect.UnsafePointer:
|
||||||
return x.Pointer() == y.Pointer()
|
return x.UnsafePointer() == y.UnsafePointer()
|
||||||
case reflect.Array:
|
case reflect.Array:
|
||||||
for i := 0; i < x.Len(); i++ {
|
for i := 0; i < x.Len(); i++ {
|
||||||
if !reflectValueEqual(x.Index(i), y.Index(i)) {
|
if !reflectValueEqual(x.Index(i), y.Index(i)) {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче