如何将 int 添加到 slice
How to prepend int to slice
我是 Go 的新手,因此我的问题可能看起来有点天真。
我有一个使用
创建的切片
var x []int;
for i := 2; i < 10; i += 2 {
x = append(x, i);
}
我想在这个切片前面加上一个整数,比如
x = append(2, x)
但显然它不会工作,因为 append 需要一个切片作为第一个参数。
我试过 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)
}
游乐场: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 中,我们经常将实现细节隐藏在函数中。 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。
当前版本是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)
}
示例形式:https://codingair.wordpress.com/2014/07/18/go-appendprepend-item-into-slice/
另一个答案使用 append
和 copy
,但您可以只使用 append
,
一两行:
package main
import "fmt"
func main() {
{
a := []int{20, 30}
a = append(append(a, 10), a...)[len(a):]
fmt.Println(a)
}
{
a := []int{20, 30}
a = append(make([]int, 1), a...)
a[0] = 10
fmt.Println(a)
}
{ // if starting with empty slice, use: a := make([]int, 0, 1)
a := []int{20, 30}
a = append(a[:1], a...)
a[0] = 10
fmt.Println(a)
}
}
或者作为另一种选择,您可以使用链表:
package main
import (
"container/list"
"fmt"
)
func main() {
a := list.New()
a.PushBack(20)
a.PushBack(30)
a.PushFront(10)
for n := a.Front(); n != nil; n = n.Next() {
fmt.Println(n.Value)
}
}
我知道这个问题只针对 int
但我想我会把这个添加到讨论中:
https://play.golang.com/p/PNax2a1rL3q
import (
"golang.org/x/exp/constraints"
)
type Number interface {
constraints.Signed | constraints.Unsigned | constraints.Float
}
func prepend[T Number](list []T, elems ...T) []T {
results := make([]T, len(list)+len(elems))
results = append(results, 0)
copy(results[len(elems):], list)
copy(results[:len(elems)], elems)
return results
}
参考文献:
我是 Go 的新手,因此我的问题可能看起来有点天真。
我有一个使用
创建的切片var x []int;
for i := 2; i < 10; i += 2 {
x = append(x, i);
}
我想在这个切片前面加上一个整数,比如
x = append(2, x)
但显然它不会工作,因为 append 需要一个切片作为第一个参数。
我试过 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)
}
游乐场: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 中,我们经常将实现细节隐藏在函数中。 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。
当前版本是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)
}
示例形式:https://codingair.wordpress.com/2014/07/18/go-appendprepend-item-into-slice/
另一个答案使用 append
和 copy
,但您可以只使用 append
,
一两行:
package main
import "fmt"
func main() {
{
a := []int{20, 30}
a = append(append(a, 10), a...)[len(a):]
fmt.Println(a)
}
{
a := []int{20, 30}
a = append(make([]int, 1), a...)
a[0] = 10
fmt.Println(a)
}
{ // if starting with empty slice, use: a := make([]int, 0, 1)
a := []int{20, 30}
a = append(a[:1], a...)
a[0] = 10
fmt.Println(a)
}
}
或者作为另一种选择,您可以使用链表:
package main
import (
"container/list"
"fmt"
)
func main() {
a := list.New()
a.PushBack(20)
a.PushBack(30)
a.PushFront(10)
for n := a.Front(); n != nil; n = n.Next() {
fmt.Println(n.Value)
}
}
我知道这个问题只针对 int
但我想我会把这个添加到讨论中:
https://play.golang.com/p/PNax2a1rL3q
import (
"golang.org/x/exp/constraints"
)
type Number interface {
constraints.Signed | constraints.Unsigned | constraints.Float
}
func prepend[T Number](list []T, elems ...T) []T {
results := make([]T, len(list)+len(elems))
results = append(results, 0)
copy(results[len(elems):], list)
copy(results[:len(elems)], elems)
return results
}
参考文献: