接受多个参数类型的golang结构方法

ruyhziif  于 2023-03-21  发布在  Go
关注(0)|答案(2)|浏览(167)

我的方法如下所示:

func (t *Worker) updateInfo(n structType1, node structType2)

但是,现在我需要使用这个API来处理structType1和structType3,这意味着n可能是structType3。
我如何修改方法来实现这一点,而不是像下面这样编写另一个方法并复制相同的代码?

func (t *Worker) updateInfo(n structType3, node structType2)

编辑:这些结构体都是我自己自定义的结构体

des4xlb0

des4xlb01#

在这种情况下,可以使用泛型
例如,假设structType1structType2有一个名为Print的方法。

type  structType1 struct {}
func(st1 structType1) Print() {
 fmt.Println("Calling Print function of structType1")
}

type  structType3 struct {}
func(st3 structType3) Print() {
 fmt.Println("Calling Print function of structType2")
}

我们可以定义一个接口类型声明,如下所示.

type Struct13 interface {
 Print()
 structType1 | structType3 // type union 
}

然后你需要用类型参数修改Worker结构和updateInfo函数。Struct13中的Print函数用于演示目的。)

type Worker[T Struct13] struct{}

func (t *Worker[T]) updateInfo(n T, node structType2) {
 n.Print()
}

我们可以如下所示使用上述实现。

st1 := structType1{}
    st2 := structType2{}
    st3 := structType3{}

    w1 := Worker[structType1]{}
    w1.updateInfo(st1,st2)

    w2 := Worker[structType3]{}
    w2.updateInfo(st3,st2)
dvtswwa3

dvtswwa32#

可以使用空接口

func (t *Worker) updateInfo(n interface{}, node structType2)

在go 1.18之后,您可以使用any

func (t *Worker) updateInfo(n any, node structType2)

在功能体中

switch v := n.(type) {
    case structType1:
        ...
    case structType3:
        ...
    default:
        ...
}

相关问题