我有一个[]byte
,我需要按升序对其进行排序。
我得到一个带有项的对象,然后迭代数组以创建返回的对象:
// unfortunately, for some obscure reason I can't change the data types of the caller and the object from the function call are different, although both are []byte underneath (...)
type ID []byte
// in another package:
type ByteInterface []byte
func (c *Store) GetAll() ByteInterface {
returnObj := make([]ByteInterface,0)
obj, err := GetData()
// err handling
for _, b := range obj.IDs {
returnObj = append(returnObj, ByteInterface(b))
}
return returnObj
}
因此,我问自己是否可以进行append
以便立即对returnObj
进行排序,或者是否需要预先对obj.ByteData
进行排序(或对{{ 1}}之后。
答案 0 :(得分:5)
在每次迭代中,请执行以下操作:
增长目标切片(可能重新分配它):
for _, b := range obj {
i := sort.Search(numElems, func (i int) bool {
return returnObj[i] >= b
}
if i < numElems {
copy(returnObj[i+1:], returnObj[i:])
}
returnObj[i] = b
numElems++
}
使用标准的插入方法,通过找到一个放置源切片中每个字节的位置,来逐一保持目标排序:
copy
(应该通过减少复制来优化对{{1}}的调用,但这是读者的练习。)