Index: src/pkg/reflect/value.go |
=================================================================== |
--- a/src/pkg/reflect/value.go |
+++ b/src/pkg/reflect/value.go |
@@ -397,6 +397,7 @@ |
Len() int |
Cap() int |
Elem(i int) Value |
+ Slice(beg, end int) *SliceValue |
addr() addr |
} |
@@ -456,6 +457,20 @@ |
return newValue(typ, p, v.canSet) |
} |
+// Slice returns a slice of the array v. |
+func (v *ArrayValue) Slice(beg, end int) *SliceValue { |
+ cap := v.Cap() |
+ if beg < 0 || end < beg || end > cap { |
+ panic("slice index out of bounds") |
+ } |
+ typ := v.typ.(*ArrayType).Slice() |
+ s := new(SliceHeader) |
+ s.Data = uintptr(v.addr()) + uintptr(beg)*typ.Elem().Size() |
+ s.Len = end - beg |
+ s.Cap = cap - beg |
+ return newValue(typ, addr(s), v.canSet).(*SliceValue) |
+} |
+ |
/* |
* slice |
*/ |