我是个新手,所以我的问题可能有点幼稚.

我有一个我用来创建的切片

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

我想在这个片段前面加一个整数,比如

x = append(2, x)

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

我已经try 了this,但它只对字符串有效,对我的情况不起作用.

推荐答案

使用切片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]

然而,这种更高效的版本可能会进行更少的分配,只有在没有备用片容量时才需要进行分配.

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)
}

操场:https://play.golang.org/p/fswXul_YfvD

输出:

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

好的代码必须是可读的.在围棋中,我们经常将实现细节隐藏在函数中.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)
}

操场:https://play.golang.org/p/wl6gvoXraKH

输出:

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

请参见Go SliceTricks.

Go相关问答推荐

Kafka消费者在需要时不会暂停

GORM Find(&;Room)操作使用空数据而不是实际数据填充 struct

golang 的持久隐蔽服务

为什么没有正确生成这些元组?

通过渠道和goroutines增值1000倍

当我有外键时,如何使用 GORM 创建数据库的新条目

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

用 fork 替换 Go 依赖:...用于两个不同的模块路径

此 Golang 程序中的同步问题

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

Go泛型:无效的复合文字

Gorm 预加载给出了模糊的列错误

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

来自洪流公告的奇怪同行字段

函数调用中的类型参数panic

分配空切片而不引用其类型?

如何优雅地映射到 Go 中返回可变长度数组的方法?

try 执行`go test ./... -v`时,Golang中有没有办法设置标志

Go/Golang:如何从 big.Float 中提取最低有效数字?

Go generics:我会在哪里使用 any 而不是 interface{}?