reflect: add Zero()
Этот коммит содержится в:
родитель
960a0b79bf
коммит
bbc79ee40a
1 изменённых файлов: 32 добавлений и 1 удалений
|
@ -1017,8 +1017,39 @@ func MakeSlice(typ Type, len, cap int) Value {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var zerobuffer unsafe.Pointer
|
||||||
|
|
||||||
|
const zerobufferLen = 32
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
// 32 characters of zero bytes
|
||||||
|
zerobufferStr := "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
|
s := (*stringHeader)(unsafe.Pointer(&zerobufferStr))
|
||||||
|
zerobuffer = s.data
|
||||||
|
}
|
||||||
|
|
||||||
func Zero(typ Type) Value {
|
func Zero(typ Type) Value {
|
||||||
panic("unimplemented: reflect.Zero()")
|
if typ.Size() < unsafe.Sizeof(uintptr(0)) {
|
||||||
|
return Value{
|
||||||
|
typecode: typ.(*rawType),
|
||||||
|
value: nil,
|
||||||
|
flags: valueFlagExported,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if typ.Size() <= zerobufferLen {
|
||||||
|
return Value{
|
||||||
|
typecode: typ.(*rawType),
|
||||||
|
value: unsafe.Pointer(zerobuffer),
|
||||||
|
flags: valueFlagExported,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Value{
|
||||||
|
typecode: typ.(*rawType),
|
||||||
|
value: alloc(typ.Size(), nil),
|
||||||
|
flags: valueFlagExported,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// New is the reflect equivalent of the new(T) keyword, returning a pointer to a
|
// New is the reflect equivalent of the new(T) keyword, returning a pointer to a
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче