如何在不重复Go代码的情况下将相同方法应用于不同类型?我有type1和type2,想要应用方法Do()
type type1 struct { }
type type2 struct { }
我必须重复代码,见下文。 Go具有静态类型,因此必须在编译期间确定类型。
func (p type1) Do() { }
func (p type2) Do() { }
这很好..但我不喜欢重复代码
type1.Do()
type2.Do()
答案 0 :(得分:3)
目前还不清楚逻辑是如何进行的,但是Go中的一个常见模式是将共享功能封装在另一个结构类型中,然后将其嵌入到您的类型中:
type sharedFunctionality struct{}
func (*sharedFunctionality) Do() {}
type type1 struct{ sharedFunctionality }
type type2 struct{ sharedFunctionality }
现在,您可以在Do()
和type1
个实例或您需要此功能的任何其他类型中调用type2
。
修改,您可以重新定义一些符合所需协议的t1
和t2
等效类型(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.Type1
和yetanother.Type2
不是由您定义的,而是由其他一些包设计器定义的。但是你可以用t1
和t2
做任何逻辑要求 - 就公共成员而言,或者你是否愿意捣乱这种反思:)
答案 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)
}