// MakeSlice creates a new zero-initialized slice value // for the specified slice type, length, and capacity. func MakeSlice(typ *SliceType, len, cap int) *SliceValue { s := &SliceHeader{ Data: uintptr(unsafe.NewArray(typ.Elem(), cap)), Len: len, Cap: cap, } return newValue(typ, addr(s), true).(*SliceValue) }
// MakeSlice creates a new zero-initialized slice value // for the specified slice type, length, and capacity. func MakeSlice(typ Type, len, cap int) Value { if typ.Kind() != Slice { panic("reflect: MakeSlice of non-slice type") } s := &SliceHeader{ Data: uintptr(unsafe.NewArray(typ.Elem(), cap)), Len: len, Cap: cap, } return valueFromAddr(0, typ, unsafe.Pointer(s)) }
// MakeSlice creates a new zero-initialized slice value // for the specified slice type, length, and capacity. func MakeSlice(typ Type, len, cap int) Value { if typ.Kind() != Slice { panic("reflect.MakeSlice of non-slice type") } // Declare slice so that gc can see the base pointer in it. var x []byte // Reinterpret as *SliceHeader to edit. s := (*SliceHeader)(unsafe.Pointer(&x)) s.Data = uintptr(unsafe.NewArray(typ.Elem(), cap)) s.Len = len s.Cap = cap return Value{typ.common(), unsafe.Pointer(&x), flagIndir | flag(Slice)<<flagKindShift} }
func (dec *Decoder) decodeSlice(atyp *reflect.SliceType, state *decodeState, p uintptr, elemOp decOp, elemWid uintptr, indir, elemIndir int, ovfl os.ErrorString) { n := int(uintptr(state.decodeUint())) if indir > 0 { up := unsafe.Pointer(p) if *(*unsafe.Pointer)(up) == nil { // Allocate the slice header. *(*unsafe.Pointer)(up) = unsafe.Pointer(new([]unsafe.Pointer)) } p = *(*uintptr)(up) } // Allocate storage for the slice elements, that is, the underlying array. // Always write a header at p. hdrp := (*reflect.SliceHeader)(unsafe.Pointer(p)) hdrp.Data = uintptr(unsafe.NewArray(atyp.Elem(), n)) hdrp.Len = n hdrp.Cap = n dec.decodeArrayHelper(state, hdrp.Data, elemOp, elemWid, n, elemIndir, ovfl) }