如何在Golang中将函数扩展到导入的类型

时间:2016-02-16 21:02:49

标签: go

我有一个导入的类型

type ExternalType struct {
   quantity int
}


type ExternalArray []*ExternalType

我希望能够为ExternalArray实现排序接口,以便按数量对其进行排序。

但是,我不确定我该怎么做?

具体的例子如下:

https://play.golang.org/p/bEPtJ8NHQK

2 个答案:

答案 0 :(得分:5)

sort.Interface定义了必须实现的三种方法:

// Len is the number of elements in the collection.
Len() int

// Less reports whether the element with
// index i should sort before the element with index j.
Less(i, j int) bool

// Swap swaps the elements with indexes i and j.
Swap(i, j int)

在这种情况下,这看起来像是:

type ExternalType struct {
   quantity int
}

type ExternalArray []*ExternalType

func (ea ExternalArray) Len() int {
    return len(ea)
}

func (ea ExternalArray) Less(i, j int) bool {
    return ea[i].quantity < ea[j].quantity
}

func (ea ExternalArray) Swap(i, j int) {
    ea[i], ea[j] = ea[j], ea[i]
}

为了进行排序,您可以使用sort.Sort,例如:

arr := ExternalArray{
    &ExternalType{quantity: 33},
    &ExternalType{quantity: 44},
    &ExternalType{quantity: 22},
    &ExternalType{quantity: 11},
}

sort.Sort(arr)
// `arr` is now sorted :-)

Here是游乐场的一个实例。

答案 1 :(得分:3)

在当前包中定义一个类型,该类型使用与导入类型相同的元素类型对切片进行排序:

type byQuantity []*pkg.ExternalType

func (a byQuantity) Len() int           { return len(a) }
func (a byQuantity) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a byQuantity) Less(i, j int) bool { return a[i].Quantity < a[j].Quantity }

Convert导入的切片类型值为上面定义的类型并排序:

a := pkg.ExternalArray{{1}, {3}, {2}}
sort.Sort(byQuantity(a))
// a is now sorted by quantity

由于原始切片和转换后的切片共享相同的支持数组,因此对转换切片进行排序也会对原始切片进行排序。

playground example