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

GIR*_*ANI 0 go

我想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,而无需为我的自定义类型创建自己的SwapLess方法。

mur*_*uru 5

您可以嵌入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”的形式添加任何您想要的内容,唯一需要注意的是您的新类型必须有一个新名称,并且其所有字段和方法必须位于其新包中。

  • 迈克尔·琼斯