在Golang中封装`sort`接口

时间:2016-04-13 20:07:26

标签: go encapsulation

我试图在Go中对一块结构进行排序。我可以通过在包的顶层定义3个方法来实现sort.Interface

type byName []*Foo // struct Foo is defined in another package

func (a byName) Len() int           { return len(a) }
func (a byName) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a byName) Less(i, j int) bool { return a[i].Name < a[j].Name }

func Bar() {
    var foos []*Foo // Populated by a call to an outside function

    sort.Sort(byName(foos))
    ...
}

有没有办法将3个方法定义(LenSwapLess)移到Bar函数中,在Go中定义一个匿名方法? / p>

// Something like this
func Bar() {
    ...
    Len := func (a byName)() int { return len(a) }
}

可以从这个包的外部访问顶层定义的3个方法吗?我猜不是,因为类型byName是本地的。

1 个答案:

答案 0 :(得分:2)

简单的回答,不,Go中没有匿名方法这样的东西。

由于匿名函数不能使用接收者声明,因此它们实际上不是方法,因此byName类型不会实现所需的sort.Interface