我想ReverseSort在sort.IntSlice. 所以我创建了一个自定义类型MySlice并添加了一个方法ReverseSort。package mainimport ( "fmt" "sort")type MySlice sort.IntSlicefunc (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方法。
1 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
您可以嵌入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)
}
(在去游乐场。)
当然,这使得构造对象更加困难。
一篇关于 golang-nut 的帖子讨论了这个:
您“无法在非本地类型 [s] 上定义新方法”,按照设计。
最佳实践是将非本地类型嵌入到您自己的本地类型中,并对其进行扩展。类型别名(MyFoo Foo 类型)创建了一种(或多或少)与原始类型完全不同的类型。我不知道使用类型断言来解决这个问题的直接/最佳实践方法。
彼得·伯根
和:
类型的方法位于定义它的包中。
这是逻辑上的连贯性。这是一种汇编美德。它被视为大型维护和多人开发项目的重要好处。
但是,您所说的功能并没有丢失,因为您可以将基本类型嵌入到如上所述的新类型中,并在您寻求的那种功能性“is a”中添加您想要的任何内容,唯一需要注意的是你的新类型必须有一个新名称,并且它的所有字段和方法都必须在它的新包中。
迈克尔·琼斯
- 1 回答
- 0 关注
- 248 浏览
添加回答
举报
0/150
提交
取消