Go 如何在字节数组中交换两个片?

Go 如何在字节数组中交换两个片?,go,Go,我尝试使用以下代码交换片0:10和片10:20。但是 data1 := make([]byte, 100) tmp := data1[0:10] data1[0:10] = data1[10:20] data1[10:20] = tmp 但我收到了这样的错误信息 ../xxx.go:60:14: cannot assign to data1[0:10] ../xxx.go:61:15: cannot assign to data1[10:20] 有人能告诉我如何交换字节数组

我尝试使用以下代码交换片0:10和片10:20。但是

  data1 := make([]byte, 100)
  tmp := data1[0:10]
  data1[0:10] = data1[10:20]
  data1[10:20] = tmp 
但我收到了这样的错误信息

../xxx.go:60:14: cannot assign to data1[0:10]
../xxx.go:61:15: cannot assign to data1[10:20]

有人能告诉我如何交换字节数组中的两个片吗?谢谢。

您正在尝试交换基础数组的内容。唯一的方法是交换单个元素:

for i := 0; i < 10; i++ {
    data[i], data[i+10] = data[i+10], data[i]
}
i:=0的
;i<10;i++{
数据[i],数据[i+10]=数据[i+10],数据[i]
}
或:

j:=10
对于i:=0;i<10;i++{
数据[i],数据[j]=数据[j],数据[i]
j++
}

@BurakSerdar的答案是,对于小块数据的移动和操作的交换性质来说,效率最高

如果您想知道如何复制切片的各个部分,只需使用内部
copy
功能:

copy(data[0:10], data[10:20]) // overwrites first 10-bytes with next 10 bytes
使用copy执行交换有点尴尬,但如果您好奇:

// tmp := data[0:10] // will *NOT* work
//                   // as `tmp` will just reference data's underlying byte-array

tmp := make([]byte, 10) // need fresh memory
copy(tmp, data[0:10])

copy(data[0:10], data[10:20])

copy(data[10:20], tmp)

如果要在C中执行此操作,可以使用
memcpy
而不是单独的变量
j
。如果使用Cgo调用
memcpy
并使用
unsafe
库获取指向底层数组的直接指针,那么在Go中也可以有效地执行相同的操作。如何在不使用其他存储的情况下使用memcpy交换内存?如果您想使用额外的存储,您可以使用copy()在go中执行相同的操作。@jcdi请参阅。因此
copy
解决方案将比for-loop解决方案更快?这取决于具体情况。对于大内存块,我希望
copy
得到更优化。但对于您的“交换”操作,确实需要临时缓冲区-所以这是一个惩罚。也许您可以为临时空间留出一个永久缓冲区,这样就不需要每次都分配临时空间。我们必须了解所有这些才能确定,因为每个目标体系结构指令集都是不同的,加上编译器优化增加了许多未知因素。针对您的特定用例进行测量是知道哪一个更好的唯一方法。
// tmp := data[0:10] // will *NOT* work
//                   // as `tmp` will just reference data's underlying byte-array

tmp := make([]byte, 10) // need fresh memory
copy(tmp, data[0:10])

copy(data[0:10], data[10:20])

copy(data[10:20], tmp)