为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
交互式爱情 2021-12-27 10:48:38
我想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”中添加您想要的任何内容,唯一需要注意的是你的新类型必须有一个新名称,并且它的所有字段和方法都必须在它的新包中。


迈克尔·琼斯


查看完整回答
反对 回复 2021-12-27
  • 1 回答
  • 0 关注
  • 248 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信