如何在切片前添加int

cod*_*oda 3 arrays go slice prepend

我对Go相当陌生,因此我的问题似乎有点天真。

我有一个使用创建的切片

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

我想在此切片前添加一个整数,例如

x = append(2, x)
Run Code Online (Sandbox Code Playgroud)

但显然它不起作用,因为append需要一个切片作为第一个参数。

我已经尝试过了,但是它仅适用于字符串,在我的情况下不起作用。

pet*_*rSO 16

使用切片复合文字[]int{1},例如,

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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https : //play.golang.org/p/Yc87gO7gJlD

输出:

[2 4 6 8]
[1 2 4 6 8]
Run Code Online (Sandbox Code Playgroud)

但是,此更有效的版本可能会分配较少的内容。仅当没有备用分片容量时才需要分配。

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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https : //play.golang.org/p/fswXul_YfvD

输出:

[2 4 6 8]
[1 2 4 6 8]
Run Code Online (Sandbox Code Playgroud)

好的代码必须可读。在Go中,我们通常将实现细节隐藏在函数内。Go编译器正在优化编译器,prependInt内联了小型,简单的函数(如)。

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)
}
Run Code Online (Sandbox Code Playgroud)

游乐场:https : //play.golang.org/p/wl6gvoXraKH

输出:

4 4 [2 4 6 8]
5 8 [1 2 4 6 8]
Run Code Online (Sandbox Code Playgroud)

请参阅Go SliceTricks


小智 9

当前版本是go1.14.11

没有 for 循环的前置:

package main

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

采取的示例:https://codingair.wordpress.com/2014/07/18/go-appendprepend-item-into-slice/

适用于整数:https ://play.golang.org/p/gaLhB5_d1Iu

  • @mh-cbon 是的,这会分配。请参阅 PeterSo 的答案中的“prependInt”,以获取最小化分配的解决方案。 (2认同)