从抽象结构转换为具体结构
我在 Go 中遇到了一个轻微但很烦人的问题。我有一个用于项目的抽象结构,然后我将其用于具体结构。下面是一个例子:
type Abstract struct {
ID uint64
Name string
Update func()
}
type Concrete struct {
Abstract
Description string
}
当我使用我的对象时,我总是使用抽象结构(考虑到我有大约 10 个基于它的具体结构)。一个例子:
func DoSomething(abstract Abstract) {
}
但是...假设我想访问在具体结构上定义的属性/函数。我将如何从抽象结构转换为具体结构?
我试过这个:
concr, valid := abstract.(*Concrete)
但这要求抽象结构是一个接口,但它不能是一个接口,因为那些不允许属性/变量。
有什么办法可以解决这个问题吗?我看到的唯一方法会让我很头疼,那就是将 Abstract 变成一个接口,然后让我的所有具体对象自己定义属性/变量。那里有很多重复的代码,这可能会导致意外的维护问题。
回答
首先,Go 中没有抽象结构。所有的结构都是具体的。您正在做的是嵌入,而不是继承。封闭结构不是封闭结构的实例,它包含它。
解决这个问题的方法是为 Go 制定解决方案,而不是为具有继承性的语言制定解决方案。一种方法是使用接口:
type Intf interface {
GetID() int64
GetName() string
}
然后在Abstract结构体中实现这些功能:
func (a Abstract) GetID() int64 {...}
func (a Abstract) GetName() string {...}
然后你可以这样做:
type Concrete struct {
Abstract
// More fields
}
在此之后,Concrete实现 interface Intf,您可以编写一个doSomething(Intf)函数并将Concrete实例传递给它。
- Your attitude is not helpful. Go is actually much easier to learn compared to other languages. You are making the same mistake many did before you: you are trying to do things the way you know instead of learning how those things are done in Go. Go is *not* an object-oriented language.