我想在ReverseSort
上创建sort.IntSlice
方法。所以我创建了一个自定义类型MySlice
,并为其添加了ReverseSort
方法。
package main
import (
"fmt"
"sort"
)
type MySlice sort.IntSlice
func (ms MySlice) ReverseSort() {
sort.Sort(sort.Reverse(ms))
}
func main() {
t2 := MySlice{5, 4, 3, 1}
t2.ReverseSort()
fmt.Println(t2)
}
但是在运行此程序时会显示错误
cannot use ms (type MySlice) as type sort.Interface in argument to sort.Reverse:
MySlice does not implement sort.Interface (missing Len method)
我是否可以通过这种方式实现此功能,而无需为自定义类型创建自己的Len
,Swap
和Less
方法。
答案 0 :(得分:4)
您可以在自定义类型中嵌入sort.IntSlice
:
type MySlice struct {
sort.IntSlice
}
func (ms MySlice) ReverseSort() {
sort.Sort(sort.Reverse(ms))
}
func main() {
t2 := MySlice{sort.IntSlice{5, 4, 3, 1}}
t2.ReverseSort()
fmt.Println(t2)
}
(在the Go Playgroud上。)
当然,这会使构建对象变得更加困难。
A post on golang-nuts讨论了这个问题:
你"无法在非本地类型[s]上定义新方法,"按设计。
最佳做法是将非本地类型嵌入到您自己的类型中 本地类型,并扩展它。类型别名(类型MyFoo Foo)创建一个 类型(或多或少)完全不同于原始类型。我'米 不知道使用类型的简单/最佳实践方式 主张解决这个问题。
- Peter Bourgon
和
类型的方法在包中定义它。
这是一种逻辑连贯性。这是一种汇编的美德。它被视为 大规模维护和多人的重要好处 开发项目。
你所说的力量并没有丢失,因为你可以嵌入 如上所述的新类型的基类型并添加您想要的任何内容 对它来说,在那种功能性的#34;是一个"你寻求的,唯一的 请注意,您的新类型必须具有新名称及其所有字段 和方法必须在新的包中。
- Michael Jones