Arrays 如何将int预加到切片

Arrays 如何将int预加到切片,arrays,go,slice,prepend,Arrays,Go,Slice,Prepend,我是个新手,所以我的问题可能有点幼稚 我有一个切片,我用 var x []int; for i := 2; i < 10; i += 2 { x = append(x, i); } 但显然,它不会工作,因为append需要一个切片作为第一个参数 我已经尝试过,但它只对字符串有效,在我的情况下不起作用。使用切片:[]int{1},例如: package main import ( "fmt" ) func main() { var x []i

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

我有一个切片,我用

var x []int;
for i := 2; i < 10; i += 2 {
    x = append(x, i);
}
但显然,它不会工作,因为append需要一个切片作为第一个参数

我已经尝试过,但它只对字符串有效,在我的情况下不起作用。

使用切片:
[]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)
}

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

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

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


请参阅。

当前版本为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)
}
采取的形式示例:


使用整数:

另一个答案使用
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)
   }
}

追加和反转?您应该将第一个参数设置为要预先追加(推送)的数组。这是否分配?或者编译器中是否有一些技巧来改进它?这里显示的prepend操作与接受的答案相同。此答案与接受的答案之间的区别在于,示例数据是使用复合文字而不是for循环创建的。@mh cbon Yes,这将进行分配。请参阅PeterSo答案中的
prependInt
,以获得最小化分配的解决方案。
a=append([]int{10},a…)
比此处显示的append选项更简单。
4 4 [2 4 6 8]
5 8 [1 2 4 6 8]
package main

import "fmt"
func main () {
  data := []int{1, 2, 3, 4}
  fmt.Println(data)
  data = append([]int{99}, data...)
  fmt.Println(data)
}
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)
   }
}