在golang推荐中切片合并

时间:2017-05-12 09:13:33

标签: go slice

有没有办法让这个golang代码缩短?

<web-app>
  <display-name>Archetype Created Web Application</display-name>

   <servlet>
        <servlet-name>stellar</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>stellar</servlet-name>

        <url-pattern>/</url-pattern>
    </servlet-mapping>



</web-app>

3 个答案:

答案 0 :(得分:5)

您无法消除循环以将每个元素单独转换为int,因为您无法转换不同元素类型的整个切片。有关说明,请参阅此问题:Type converting slices of interfaces in go

您可以做的最多的事情是使用命名结果类型,使用具有2个迭代值的for range,您可以通过将其分配给blank identifier和第2个来省略第一个(索引)将是价值:

func MergeSlices(s1 []float32, s2 []int32) (s []int) {
    for _, v := range s1 {
        s = append(s, int(v))
    }
    for _, v := range s2 {
        s = append(s, int(v))
    }
    return
}

但要知道你的代码是正常的。我的代码并不总是遵循,它是回答你的问题:如何缩短你的代码。如果你想改进你的代码,你可以先看看它的性能,甚至重构你的代码,最终不需要合并不同类型的切片。

答案 1 :(得分:1)

var s1 []int
var s2 []int

newSlice = append(s1, s2...)

答案 2 :(得分:0)

代码无法获得任何更短的,但这是一个值得怀疑的目标;它不是过于冗长的原样。但是,您可以通过消除中间分配来提高性能。每次调用append时,如果目标切片没有足够的空间,它会扩展它,猜测必要的大小,因为你没有告诉它需要多少空间。

最简单的方法是预先设定目标切片(将var slice []int替换为slice := make([]int, 0, len(s1) + len(s2));这样,追加永远不必扩展它。将第二个参数设置为0很重要,设置< em> length 为零,容量为所需的总大小,以便您的附加按预期工作。

一旦你预先确定了它,你可以完全摆脱附加,并直接设置每个索引:

func MergeSlices(s1 []float32, s2 []int32) []int {
    slice := make([]int, len(s1) + len(s2))
    for i,v := range s1 {
        slice[i] = int(v)
    }
    for i,v := range s2 {
        slice[i+len(s1)] = int(v)
    }
    return slice
}

Playground link