排序时忽略nil元素

Ken*_*tov 1 sorting go slice

为了排序这样的结构我实现了三种方法:

type Event struct {
    timeEnd interface{}
    size float64
}

func (s ByTime) Len() int {
    return len(s)
}
func (s ByTime) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
Run Code Online (Sandbox Code Playgroud)

有时并非所有Events.timeEnd都被初始化,我想将这些Events放入切片的背面并按size字段对它们进行排序.

func (s ByTime) Less(i, j int) bool {
    if s[i].timeEnd == nil || s[j].timeEnd == nil{
        return s[i].size < s[j].size
    }else {
        return s[i].timeEnd.(float64) < s[j].timeEnd.(float64)
    }
}

 a, b, c, d := Event{timeEnd:12.}, Event{timeEnd:nil, size:-10}, Event{timeEnd:56.}, Event{timeEnd:nil, size:2}
 queue := []*Event{}
 queue = append(queue, &a, &b, &c, &d) 
Run Code Online (Sandbox Code Playgroud)

但结果我有:

[<nil> 12 56 <nil>] 
Run Code Online (Sandbox Code Playgroud)

期待[12 56 <nil> <nil>] 如何正确实现它?

这是https://play.golang.org/p/FWU98npGtbU中的示例

mu *_*ort 5

Less,你不想比较size除非她 timeEnd s为nil,然后你需要处理"只有一个timeEndnil分开"的情况.所以你有四个案例要考虑不是两个:

func (s ByTime) Less(i, j int) bool {
    if s[i].timeEnd == nil && s[j].timeEnd == nil{
        return s[i].size < s[j].size
    } else if s[i].timeEnd == nil {
        return false
    } else if s[j].timeEnd == nil {
        return true
    } else {
        return s[i].timeEnd.(float64) < s[j].timeEnd.(float64)
    }
}
Run Code Online (Sandbox Code Playgroud)