drake900918 2018-12-12 06:43
浏览 72
已采纳

如何在切片前添加int

I am fairly new to Go and thus my question might seem a bit naive.

i have a slice which I created using

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

I want to prepend an integer to this slice, something like

x = append(2, x)

but obviously it won't work since append needs a slice as the first argument.

I have tried this but it only works for strings and it's not working in my case.

  • 写回答

1条回答 默认 最新

  • drzdu44226 2018-12-12 06:58
    关注

    Use a slice composite literal: []int{1}, For example,

    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

    Output:

    [2 4 6 8]
    [1 2 4 6 8]
    

    However, this more efficient version may make fewer allocations, An allocation is only necessary when there is no spare slice capacity.

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

    Playground: https://play.golang.org/p/fswXul_YfvD

    Output:

    [2 4 6 8]
    [1 2 4 6 8]
    

    Good code must be readable. In Go, we often hide implementaion details inside a function. Go compilers are optimizing compilers, small, simple functions (like prependInt) are inlined.

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

    Playground: https://play.golang.org/p/wl6gvoXraKH

    Output:

    4 4 [2 4 6 8]
    5 8 [1 2 4 6 8]
    

    See Go SliceTricks.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 多址通信方式的抗噪声性能和系统容量对比
  • ¥15 winform的chart曲线生成时有凸起
  • ¥15 msix packaging tool打包问题
  • ¥15 finalshell节点的搭建代码和那个端口代码教程
  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据