How to prepend int to slice

48,935

Solution 1

Use a slice composite literal: []int{1}, For example:

package main

import (
    "fmt"
)

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(x)

    x = append([]int{1}, x...)

    fmt.Println(x)
}

Playground: https://play.golang.org/p/Yc87gO7gJlD

Output:

[2 4 6 8]
[1 2 4 6 8]

However, this more efficient version may make fewer allocations, An allocation is only necessary when there is no spare slice capacity.

package main

import (
    "fmt"
)

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(x)

    x = append(x, 0)
    copy(x[1:], x)
    x[0] = 1

    fmt.Println(x)
}

Playground: https://play.golang.org/p/fswXul_YfvD

Output:

[2 4 6 8]
[1 2 4 6 8]

Good code must be readable. In Go, we often hide implementaion details inside a function. Go compilers are optimizing compilers, small, simple functions (like prependInt) are inlined.

package main

import (
    "fmt"
)

func prependInt(x []int, y int) []int {
    x = append(x, 0)
    copy(x[1:], x)
    x[0] = y
    return x
}

func main() {
    var x []int
    for i := 2; i < 10; i += 2 {
        x = append(x, i)
    }
    fmt.Println(len(x), cap(x), x)

    x = prependInt(x, 1)

    fmt.Println(len(x), cap(x), x)
}

Playground: https://play.golang.org/p/wl6gvoXraKH

Output:

4 4 [2 4 6 8]
5 8 [1 2 4 6 8]

See Go SliceTricks.

Solution 2

The current version is go1.14.11

Prepend without a for loop:

package main

import "fmt"
func main () {
  data := []int{1, 2, 3, 4}
  fmt.Println(data)
  data = append([]int{99}, data...)
  fmt.Println(data)
}

Example taken form: https://codingair.wordpress.com/2014/07/18/go-appendprepend-item-into-slice/

Works with integers: https://play.golang.org/p/gaLhB5_d1Iu

Share:
48,935
coda
Author by

coda

Software Development Engineer @Amazon

Updated on April 28, 2021

Comments

  • coda
    coda about 3 years

    I am fairly new to Go and thus my question might seem a bit naive.

    I have a slice which I created using

    var x []int;
    for i := 2; i < 10; i += 2 {
        x = append(x, i);
    }
    

    I want to prepend an integer to this slice, something like

    x = append(2, x)
    

    but obviously it won't work since append needs a slice as the first argument.

    I have tried this but it only works for strings and it's not working in my case.

  • Admin
    Admin about 3 years
    does this allocate ? or is there some trick in the compiler to improve it ?
  • Admin
    Admin about 3 years
    a = append([]int{10}, a...) is simpler than the append options shown here.
  • Admin
    Admin about 3 years
    The prepend operation shown here is identical to the accepted answer. The difference between this answer and the accepted answer is that the example data is created with a composite literal instead of a for loop.
  • Admin
    Admin about 3 years
    @mh-cbon Yes, this allocates. See prependInt in PeterSo's answer for a solution that minimizes allocations.