在下面的代码中,我展示了我认为在golang中嵌入(方法得到提升)和组合(不提升方法)之间的区别.
你为什么要在golang中使用组合?
type obj1Inherited struct {
obj2
}
type obj1Composed struct {
someobj obj2
}
type obj2 struct {
}
func (o obj2) printTest() {
fmt.Println("obj2")
}
func main() {
o := obj1Inherited{}
o.printTest() //fine - printTest is promoted
obj1Composed := obj1Composed{}
obj1Composed.selector.printTest() //fine because I'm using the composed obj
obj1Composed.printTest() //not fine - printTest is NOT promoted
Run Code Online (Sandbox Code Playgroud)
关于嵌入有效围棋的部分是值得的.
一个常见的例子是使用带有互斥锁的结构/映射.
type SafeStruct struct {
SomeField string
*sync.Mutex
}
Run Code Online (Sandbox Code Playgroud)
打字要容易得多
safe := SafeStruct{SomeField: "init value"}
safe.Lock()
defer safe.Unlock()
safe.SomeField = "new value"
Run Code Online (Sandbox Code Playgroud)
而不是必须编写适当的包装函数(重复)或口吃
safe.mutex.Unlock()
Run Code Online (Sandbox Code Playgroud)
当你将永远做互斥领域的唯一事情就是访问方法(Lock()和Unlock()在这种情况下)
当您尝试在嵌入字段上使用多个函数(实现类似的接口io.ReadWriter)时,这会变得更加有用.
| 归档时间: |
|
| 查看次数: |
2749 次 |
| 最近记录: |