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

时间:2016-03-18 20:55:49

标签: 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)
}

但是在运行此程序时会显示错误

cannot use ms (type MySlice) as type sort.Interface in argument to sort.Reverse:
        MySlice does not implement sort.Interface (missing Len method)

我是否可以通过这种方式实现此功能,而无需为自定义类型创建自己的LenSwapLess方法。

1 个答案:

答案 0 :(得分:4)

您可以在自定义类型中嵌入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)
}

(在the Go Playgroud上。)

当然,这会使构建对象变得更加困难。

A post on golang-nuts讨论了这个问题:

  

你"无法在非本地类型[s]上定义新方法,"按设计。

     

最佳做法是将非本地类型嵌入到您自己的类型中   本地类型,并扩展它。类型别名(类型MyFoo Foo)创建一个   类型(或多或少)完全不同于原始类型。我'米   不知道使用类型的简单/最佳实践方式   主张解决这个问题。

     
      
  • Peter Bourgon
  •   

  
    

类型的方法在包中定义它。

  
     

这是一种逻辑连贯性。这是一种汇编的美德。它被视为   大规模维护和多人的重要好处   开发项目。

     

你所说的力量并没有丢失,因为你可以嵌入   如上所述的新类型的基类型并添加您想要的任何内容   对它来说,在那种功能性的#34;是一个"你寻求的,唯一的   请注意,您的新类型必须具有新名称及其所有字段   和方法必须在新的包中。

     
      
  • Michael Jones
  •