With repetition and copying
append() . () .
, ( "" ), , , , 0 th. . :
func prepend(dest []int, value int) []int {
if cap(dest) > len(dest) {
dest = dest[:len(dest)+1]
copy(dest[1:], dest)
dest[0] = value
return dest
}
res := make([]int, len(dest)+1, len(dest)+5)
res[0] = value
copy(res[1:], dest)
return res
}
:
s := make([]int, 0, 5)
s = append(s, 1, 2, 3, 4)
fmt.Println(s)
s = prepend(s, 9)
fmt.Println(s)
s = prepend(s, 8)
fmt.Println(s)
( Go Playground):
[1 2 3 4]
[9 1 2 3 4]
[8 9 1 2 3 4]
. , , :
res := append([]int{value}, dest...)
, : ([]int{value}), append() , dest.
( make(), ), value dest ( ).
, . , / , node, root, root ( ).
container/list.
, .
( ), , . , , 1 .
, :
var backing = make([]int, 15) // 15 elements
var start int
func prepend(dest []int, value int) []int {
if start == 0 {
// No more room for new value, must allocate bigger backing array:
newbacking := make([]int, len(backing)+5)
start = 5
copy(newbacking[5:], backing)
backing = newbacking
}
start
dest = backing[start : start+len(dest)+1]
dest[0] = value
return dest
}
/:
start = 5
s := backing[start:start] // empty slice, starting at idx=5
s = append(s, 1, 2, 3, 4)
fmt.Println(s)
s = prepend(s, 9)
fmt.Println(s)
s = prepend(s, 8)
fmt.Println(s)
// Prepend more to test reallocation:
for i := 10; i < 15; i++ {
s = prepend(s, i)
}
fmt.Println(s)
( Go Playground):
[1 2 3 4]
[9 1 2 3 4]
[8 9 1 2 3 4]
[14 13 12 11 10 8 9 1 2 3 4]
: , backing !. , , backing +1 , , . , .
, backing, , "".
: , .
, preand !
, "" , append(s, value). .
, (, , , , "" preand), ( for range , ), wise preanding , append().
. , , , :
for i := len(s) - 1; i >= 0; i-- {
// do something with s[i]
}
: , . , reslicing +1, +len(values), dst[0] = value, copy(dst, values).