基于下面的示例,“在字段中嵌入结构”似乎是为了打破 Go 的“提升”机制。你为什么想做这个?type obj1 struct { obj2}type obj1Selector struct { selector obj2}type obj2 struct {}func (o obj2) printTest() { fmt.Println("obj2")}func main() { o := obj1{} o.printTest() //fine oSelector := obj1Selector{} oSelector.selector.printTest() //fine oSelector.printTest() //not fine
1 回答
![?](http://img1.sycdn.imooc.com/5458620000018a2602200220-100-100.jpg)
慕无忌1623718
TA贡献1744条经验 获得超4个赞
你没有别名任何东西,选择器是指可以使用点表示法在类型上引用的一组事物。您正在使用一个名为 embedding、obj1
embeds的概念obj2
。obj1Selector
有一个名为selector
type 的字段obj2
。别名看起来像这样;type obj3 obj2
它声明obj3
为obj2
.
它打破了 Go 的提升机制?抱歉,您对如何工作的整个想法是断章取意的。obj1Selector
不嵌入类型obj2
,因此没有来自obj2
'promoted'的字段/方法,obj1
embeds obj2
,因此它的字段/方法'promoted'。obj1Selector
没有实现那个接口,obj1Selector.selector
确实如此。
我为什么要嵌入?嗯,它有点等同于继承,或者至少在 Go 中开发时提供了类似的功能集。也许我在数据存储中有许多记录,它们都共享 10 个公共字段,然后还有另外 10 个字段,这些字段取决于它们来自哪个表。正如我会在典型的面向对象语言(如 C++、C# 或 Java)中使用继承来减少重复一样,我会在 Go 中使用嵌入。在我看来,这是它的主要用例。这是一种组合和继承的奇怪组合。您正在编写其他对象(您嵌入的对象)的对象,但由于嵌入类型的方法/字段被提升到嵌入器范围,因此它的功能很像嵌入器从嵌入类型继承的。希望对您在这里处理的事情有所澄清......你没有'
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报
0/150
提交
取消