在golang切片中移动元素

时间:2018-04-16 17:11:45

标签: go slice

我有以下[] []界面{}:

[ 
  [1 65535 62242] [1 65531 20924] [1 96 229] [1 52 208] [1 58 207] 
  [2 65535 62680] [2 65531 20654] [2 28 212] [2 64 211] [2 17 210] [2 75 208]  
  [3 65535 62297] [3 65531 20694] [3 30 208] [3 87 207] [3 3 205] [3 36 204]
]

我需要移动元素才能获得以下结果:

[ 
  [1 65535 62242] [1 65531 20924] [1 96 229] [1 52 208] [1 58 207] 
  [3 65535 62297] [3 65531 20694] [3 30 208] [3 87 207] [3 3 205] [3 36 204]
  [2 65535 62680] [2 65531 20654] [2 28 212] [2 64 211] [2 17 210] [2 75 208]  
]

我已经检查了' Slicetricks'页面,但经过测试和测试后,我无法找到方法。

1 个答案:

答案 0 :(得分:1)

  

这是一个包含17个元素的切片,每个元素都是另一个切片。我需要将元素从位置11:16(第一个元素为3的那些切片)移动到位置5:10

如果您了解切片如何引用基础数组(如果不这样,请阅读https://blog.golang.org/go-slices-usage-and-internals),并且您有要交换的特定元素,则可以在这些元素上创建两个切片并按顺序交换它们。如果你所关心的只是移动东西,你所移动的东西并不重要。

sl0 = []AnyType{...}
sl1 = sl0[5:11] // last element is exclusive, so use to 11 if you need 10
sl2 = sl0[11:]
for i := 0; i < len(sl1); i++ {
   sl1[i], sl2[i] = sl2[i], sl1[i]
}

在此之后,sl0将包含交换特定元素的整个切片。

请注意,因为使用这种方法存在各种不良索引的可能性。在运行时失败之前,您应该使用检查来捕获它们。

游乐场示例:https://play.golang.org/p/WM7M2buGlil