在Golang中封装'sort'接口

在Golang中封装'sort'接口,go,encapsulation,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)

我正在尝试对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种方法是否可以从此包外部访问?我猜不是,因为类型
byName
是本地的。

简单的回答是,不,Go中没有匿名方法


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

简单回答,不,Go中没有匿名方法


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

Len的完全限定名是
packagename.byName.Len
。正如您所说,由于
byName
不可导出,
Len
对外部包也不可见。
Len
的完全限定名是
packagename.byName.Len
。正如您所说,由于
byName
是不可导出的,
Len
对于外部包也是不可见的。我希望“隐藏”这些定义,但我想既然它们只是本地的,那就足够了。我希望“隐藏”这些定义,但我想既然它们只是本地的,那就足够了。
// Something like this
func Bar() {
    ...
    Len := func (a byName)() int { return len(a) }
}