Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Go中嵌入的惯用方式是什么(不同于经典的OOP)?_Go_Interface_Embedding - Fatal编程技术网

在Go中嵌入的惯用方式是什么(不同于经典的OOP)?

在Go中嵌入的惯用方式是什么(不同于经典的OOP)?,go,interface,embedding,Go,Interface,Embedding,我正在创建一个电子商务商店,希望找到最惯用的方式来构造我的类型 我嵌入游戏类型是因为其他游戏类型几乎有相同的字段和方法集 键入GameDetails结构{ 标题字符串 价格整数 } func(g*GameDetails)String()字符串{ 返回g.标题 } func(g*GameDetails)税(比率64){ g、 价格=浮动64(总价格)*比率 } //其他游戏方法。。。 类型BoardGame结构{ 游戏详情 } 类型OnlineGame结构{ 游戏详情 } 类型视频游戏结构{ 游戏

我正在创建一个电子商务商店,希望找到最惯用的方式来构造我的类型

我嵌入游戏类型是因为其他游戏类型几乎有相同的字段和方法集

键入GameDetails结构{
标题字符串
价格整数
}
func(g*GameDetails)String()字符串{
返回g.标题
}
func(g*GameDetails)税(比率64){
g、 价格=浮动64(总价格)*比率
}
//其他游戏方法。。。
类型BoardGame结构{
游戏详情
}
类型OnlineGame结构{
游戏详情
}
类型视频游戏结构{
游戏详情
类型字符串
}
func(g*OnlineGame)String()字符串{
返回g.Title+“,”+g.流派
}
我在一个界面中表示游戏,以便我可以一起使用它们:

类型游戏界面{
String()字符串
税项(比率64)
}
func main(){
游戏:=[]游戏{
&电子游戏{…},
&棋盘游戏{…},
&在线游戏{…},
}
//…向用户打印游戏
}
我可以轻松地将游戏封送为JSON,并且我正在具体的片段中实现
UnmarshalJSON
方法,以从JSON中获取具体的游戏

类型游戏[]游戏
func(g*游戏)解组JSON(数据[]字节)错误{
// ...
}
我的问题是:这是构造代码的惯用方法吗?使用Go习惯用法构造代码的最佳方法是什么?

我觉得我是在构建继承层次结构,而不是编写。如何摆脱我以前的OOP习惯?你能给我举个例子吗?这个代码有什么问题

我阅读了其他答案,但人们只说:“不要在Go中这样做,没有继承”等等。我知道这一点,但我找不到一个好的例子来解释代码示例中的这一点



对于任何阅读此问题的人来说,和包中都有类似的实现。

您的问题非常广泛。嵌入是一种很好的语法糖,可以生成一个组合,并在嵌入它的组合上公开嵌入类型的方法。如果这是您的域的适当数据模型,那么就可以了。如果不是,那就不是。这里没有什么“习惯用语”。它要么适合,要么不适合。如果GameDetails没有在每个游戏中直接展示很多方法,那么这可能不是一个好方法。如果是,那就是。你的在线游戏的字符串方法稍微“打破”了干净的嵌入。如果这是一个例外:很好。看看
testing.T
testing.B
如何嵌入
common
。这很好地工作,因为
T
B
都可以将一组工作委托给生活在其中的
普通人。这不是继承。尤其是你的例子不是“继承式的”。您可以通过
游戏
界面对多态性进行建模。
Game
的不同实现将多个方法交给一个独立的
GameDetails
。在我看来这很好;至少,如果你不必在嵌入类型上重新实现lots if嵌入方法。只是一个提示:我真的不会在我的
String
函数上使用指针接收器。这些func无论如何都不会修改实际值,并且使用值接收器使类型可以安全地并发使用。有了指针接收器,就有可能同时进行写/读访问。OnlineGame破坏了它,因为它想打印自己的详细信息,有更好的方法吗?我来看看测试包,谢谢!是的,Elias,我知道,但最好保持接收器类型一致。税务方法需要有一个指针接收器。