arrays - 如何将 int 添加到 slice

标签 arrays go slice prepend

我是 Go 的新手,因此我的问题可能看起来有点天真。

我有一个我使用创建的 slice

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

我想在这个 slice 前添加一个整数,比如

x = append(2, x)

但显然它不会工作,因为 append 需要一个 slice 作为第一个参数。

我试过了this但它只适用于字符串,对我来说不起作用。

最佳答案

使用 slice composite literal : []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)
}

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

输出:

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

但是,这个更高效的版本可能会进行更少的分配,只有在没有空闲 slice 容量时才需要分配。

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

输出:

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

好的代码必须是可读的。在 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)
}

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

输出:

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

参见 Go SliceTricks .

关于arrays - 如何将 int 添加到 slice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53737435/

相关文章:

python - 在 Pandas 的杂草中使用切片器进行多重索引

ios - 如何最好地管理 Swift 中的可选数组?

python - 制作一个 bool 数组

go - golang中的back tick是做什么的

Go 中的递归

arrays - 如何修复此代码,使其随机排列字母并且不影响第一个字母和最后一个字母、标点符号

python - 对 numpy 数组进行切片以选择列表中包含值的行。真值误差

c# - GetHashCode 和桶

创建一个函数以从文件 : which approach would be more efficient? 创建数组

go - 给定一个可执行文件,我可以确定用于构建它的 GOOS 和 GOARCH 的值吗?