我想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)
}
Run Code Online (Sandbox Code Playgroud)
但运行该程序时显示错误
cannot use ms (type MySlice) as type sort.Interface in argument to sort.Reverse:
MySlice does not implement sort.Interface (missing Len method)
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以实现这一点Len,而无需为我的自定义类型创建自己的Swap和Less方法。
您可以嵌入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)
}
Run Code Online (Sandbox Code Playgroud)
(移动游乐场。)
当然,这使得构造对象变得更加困难。
golang-nuts 上的一篇文章对此进行了讨论:
按照设计,您“无法在非本地类型上定义新方法”。
最佳实践是将非本地类型嵌入到您自己的本地类型中,并扩展它。类型别名(类型 MyFoo Foo)创建一个(或多或少)与原始类型完全不同的类型。我不知道使用类型断言来解决这个问题的简单/最佳实践方法。
- 彼得·布尔贡
和:
类型的方法位于定义它的包中。
这是逻辑上的连贯性。这是一种编译美德。它被视为大规模维护和多人开发项目的重要优势。
不过,您所说的功能并没有丢失,因为您可以将基本类型嵌入到如上所述的新类型中,并以您寻求的功能“is a”的形式添加任何您想要的内容,唯一需要注意的是您的新类型必须有一个新名称,并且其所有字段和方法必须位于其新包中。
- 迈克尔·琼斯