我有一个[]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
}
Run Code Online (Sandbox Code Playgroud)
所以我问自己是否可以这样做,append以便立即returnObj排序,或者我是否需要obj.ByteData预先排序(或后续排序returnOjb).
在每次迭代中,执行以下操作:
增长目标切片(可能重新分配):
numElems := len(returnObj)
returnObj = append(returnObj, make([]byte, len(obj))...)
Run Code Online (Sandbox Code Playgroud)使用标准方法进行插入,通过查找放置源切片中每个字节的位置来逐个对目标进行排序:
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++
}
Run Code Online (Sandbox Code Playgroud)
(copy应该通过少量复制来优化呼叫,但这仍然是读者的练习.)