Go 从抽象结构到具体结构的铸造

Go 从抽象结构到具体结构的铸造,go,Go,我在围棋中遇到了一个轻微但令人讨厌的问题。我有一个用于项的抽象结构,然后用于具体结构。以下是一个例子: func DoSomething(abstract Abstract) { } 类型抽象结构{ ID uint64 名称字符串 更新func() } 型混凝土结构{ 摘要 描述字符串 } 当我使用我的对象时,我总是使用抽象结构(考虑到我有大约10个基于它的具体结构)。例如: func DoSomething(abstract Abstract) { } 但是。。。假设我想访问在具体结构上

我在围棋中遇到了一个轻微但令人讨厌的问题。我有一个用于项的抽象结构,然后用于具体结构。以下是一个例子:

func DoSomething(abstract Abstract) {
}
类型抽象结构{
ID uint64
名称字符串
更新func()
}
型混凝土结构{
摘要
描述字符串
}
当我使用我的对象时,我总是使用抽象结构(考虑到我有大约10个基于它的具体结构)。例如:

func DoSomething(abstract Abstract) {
}
但是。。。假设我想访问在具体结构上定义的属性/函数。我如何将抽象结构转换为具体结构

我试过这个:

concr, valid := abstract.(*Concrete)
但这要求抽象结构是接口,但它不能是接口,因为这些结构不允许属性/变量


我有办法解决这个问题吗?我看到的唯一方法会让我非常头疼,那就是将抽象变成一个接口,然后让我所有的具体者自己定义属性/变量。大量重复的代码可能会导致不必要的维护问题。

首先,Go中没有抽象结构。所有结构都是混凝土。您所做的是嵌入,而不是继承。封闭结构不是封闭结构的实例,它包含它

解决这个问题的方法是为Go制定一个解决方案,而不是为一种具有继承性的语言。一种方法是使用接口:

type Intf interface {
   GetID() int64
   GetName() string
}
然后在
抽象结构中实现这些函数:

func (a Abstract) GetID() int64 {...}
func (a Abstract) GetName() string {...}
然后你可以做:

type Concrete struct {
   Abstract
   // More fields
}

在此之后,
Concrete
实现接口
Intf
,您可以编写
doSomething(Intf)
函数,并将
Concrete
实例传递给它。

ya,这也是我的建议。好吧,我这样做了,但它不起作用。转换到具体类只是抱怨接口不是接口。func which(item*Intf){conc,valid:=item.(*Concrete)}错误:无效操作:item(类型为*Intf的变量)也不是接口。。doing item.func()也不起作用,它无法识别接口上的任何函数。因此,TL;DR for Go是零多态性支持。那太好了。。。另一种死语言。不是*Intf,使用Intf。在评判之前,试着学习语言。你的态度没有帮助。与其他语言相比,围棋实际上更容易学。你犯了很多以前犯过的同样的错误:你试图以你知道的方式做事,而不是学习如何在围棋中完成这些事情。Go不是一种面向对象的语言。请注意,Go中根本没有铸造。你所说的是一种类型转换,这是一种不同的机制。无论你有多聪明,或者问这个问题的频率有多高,尝试在围棋中复制“传统的OOP”都是行不通的。只要忘掉这些概念,编写Go代码,我就看不出Go的意义了。我会继续。