gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:29:45 26 4
gpt4 key购买 nike

我想在 sort.IntSlice 上创建一个 ReverseSort 方法。所以我创建了一个自定义类型的 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 方法的情况下实现它。

最佳答案

您可以在自定义类型中嵌入 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讨论这个:

You "cannot define new methods on non-local type[s]," by design.

The best practice is to embed the non-local type into your own own local type, and extend it. Type-aliasing (type MyFoo Foo) creates a type that is (more-or-less) completely distinct from the original. I'm not aware of a straightforward/best-practice way to use type assertions to get around that.

  • Peter Bourgon

和:

A type's methods are in the package that defines it.

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

不过,您所说的力量并没有丧失,因为您可以嵌入 如上所述的新类型中的基本类型并添加任何你想要的 对它来说,在你寻求的那种功能性"is"中,只有 警告你的新类型必须有一个新名称,以及它的所有字段 和方法必须在其新包中。

  • 迈克尔·琼斯

关于go - 在 golang 的派生自定义类型中重用基类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36094060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com