如何在切片前添加int

时间:2018-12-12 06:43:06

标签: arrays go slice prepend

我刚开始使用Go,因此我的问题似乎有点天真。

我有一个使用创建的切片

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

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

x = append(2, x)

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

我尝试过this,但它仅适用于字符串,不适用于我的情况。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

当前版本为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/

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

答案 2 :(得分:0)

另一个答案使用 appendcopy,但您可以只使用 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)
   }
}

https://golang.org/pkg/container/list