golang中派生自定义类型重用基类型的方法

我想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方法。


交互式爱情
浏览 249回答 1
1回答

桃花长相依

您可以嵌入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”中添加您想要的任何内容,唯一需要注意的是你的新类型必须有一个新名称,并且它的所有字段和方法都必须在它的新包中。迈克尔·琼斯
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go