3 回答
TA贡献1719条经验 获得超6个赞
值得仔细阅读有关嵌入Effective Go的部分。
一个常见的例子是有一个带有互斥体的结构/映射。
type SafeStruct struct {
SomeField string
*sync.Mutex
}
打字要容易得多
safe := SafeStruct{SomeField: "init value"}
safe.Lock()
defer safe.Unlock()
safe.SomeField = "new value"
而不是必须编写适当的包装函数(这是重复的)或有口吃
safe.mutex.Unlock()
当你将永远做互斥领域的唯一事情就是访问方法(Lock()和Unlock()在这种情况下)
当您尝试在嵌入式字段上使用多个函数(实现类似 的接口io.ReadWriter)时,这会变得更加有用。
TA贡献1845条经验 获得超8个赞
我将尝试回答原始问题 - 有时人们使用“组合”而不是嵌入来隐藏嵌入结构的功能。不是一个很好的用例 - 但人们有时更喜欢它。
type Obj1composed struct {
notExportedObj1 obj1
}
func NewObj1Composed(someParam Params) Obj1composed {
...
}
func (o Obj1Composed) Print() {
// Some heavy calculations here. Make Dozens of API calls
// print some data
}
TA贡献1831条经验 获得超4个赞
在您的示例中,我还想针对第一种情况介绍一点。如果obj1Inherited
和obj2
具有相同名称的方法,则该方法调用(来自obj1Inherited
实例)将始终执行obj1Inherited
方法。
要调用obj2
方法,您可以使用不推广的其他方法
- 3 回答
- 0 关注
- 134 浏览
添加回答
举报