如何将相同的方法应用于Go中的不同类型?

时间:2017-02-20 19:34:22

标签: go

如何在不重复Go代码的情况下将相同方法应用于不同类型?我有type1和type2,想要应用方法Do()

type type1 struct {  }
type type2 struct {  }

我必须重复代码,见下文。 Go具有静态类型,因此必须在编译期间确定类型。

func (p type1) Do() {   }
func (p type2) Do() {   }

这很好..但我不喜欢重复代码

type1.Do()
type2.Do()

3 个答案:

答案 0 :(得分:3)

目前还不清楚逻辑是如何进行的,但是Go中的一个常见模式是将共享功能封装在另一个结构类型中,然后将其嵌入到您的类型中:

type sharedFunctionality struct{}

func (*sharedFunctionality) Do() {}

type type1 struct{ sharedFunctionality }
type type2 struct{ sharedFunctionality }

现在,您可以在Do()type1个实例或您需要此功能的任何其他类型中调用type2

根据您的评论

修改,您可以重新定义一些符合所需协议的t1t2等效类型(Do()方法)像这样:

func main() {
    var j job

    j = new(t1)
    j.Do()

    j = new(t2)
    j.Do()
}

type job interface {
    Do()
}

type t1 another.Type1

func (*t1) Do() {}

type t2 yetanother.Type2

func (*t2) Do() {}

此处类型another.Type1yetanother.Type2不是由您定义的,而是由其他一些包设计器定义的。但是你可以用t1t2做任何逻辑要求 - 就公共成员而言,或者你是否愿意捣乱这种反思:)

答案 1 :(得分:2)

你在Go中最接近的是有一种类型嵌入另一种类型。

type Type1 struct {}

func (t *Type1) Do() {
   // ...
}

type Type2 struct {
    *Type1
}

唯一的限制是您的Do()函数只能访问Type1的字段。

答案 2 :(得分:1)

我想,你可以在这里使用界面。例如:

package main

import "fmt"

type testInterface interface {
    Do()
}

type type1 struct{}
type type2 struct{}

func (t type1) Do() {
    fmt.Println("Do type 1")
}

func (t type2) Do() {
    fmt.Println("Do type 2")
}

func TestFunc(t testInterface) {
    t.Do()
}

func main() {
    var a type1
    var b type2

    TestFunc(a)
    TestFunc(b)

}