为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 int 添加到 slice

如何将 int 添加到 slice

Go
杨__羊羊 2023-05-15 15:16:17
我有一个我使用创建的切片var x []int;for i := 2; i < 10; i += 2 {    x = append(x, i);}我想在这个切片前加上一个整数,比如x = append(2, x)但显然它不会工作,因为 append 需要一个切片作为第一个参数。我试过这个,但它只适用于字符串,在我的情况下不起作用。
查看完整描述

4 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

使用切片复合文字: []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]



查看完整回答
反对 回复 2023-05-15
?
慕容森

TA贡献1853条经验 获得超18个赞

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


查看完整回答
反对 回复 2023-05-15
?
湖上湖

TA贡献2003条经验 获得超2个赞

我知道这个问题只是为了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

}

查看完整回答
反对 回复 2023-05-15
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

另一个答案使用appendand ,但您可以在一两行中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)

   }

}

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


查看完整回答
反对 回复 2023-05-15
  • 4 回答
  • 0 关注
  • 138 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信