我是个新手,所以我的问题可能有点幼稚.
我有一个我用来创建的切片
var x []int;
for i := 2; i < 10; i += 2 {
x = append(x, i);
}
我想在这个片段前面加一个整数,比如
x = append(2, x)
但显然它不会起作用,因为append需要一个切片作为第一个参数.
我已经try 了this,但它只对字符串有效,对我的情况不起作用.
我是个新手,所以我的问题可能有点幼稚.
我有一个我用来创建的切片
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.