dongzaocheng3214
dongzaocheng3214
2016-04-18 21:22

为什么要在golang中使用组合?

已采纳

In the following code I show what I think is the difference between embedding (where methods get promoted) and composition (where methods are not promoted) in golang.

Why would you ever want to use composition in 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
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • doutu6658 doutu6658 5年前

    It is worth going over the section on Embedding in Effective Go.

    A common example is having a struct/map with a Mutex.

    type SafeStruct struct {
        SomeField string 
        *sync.Mutex
    }
    

    It is much easier to type

    safe := SafeStruct{SomeField: "init value"}
    
    safe.Lock()
    defer safe.Unlock()
    safe.SomeField = "new value"
    

    than having to either write appropriate wrapper functions (which are repetitive) or have the stutter of

    safe.mutex.Unlock()
    

    when the only thing you would ever do with the mutex field is access the methods (Lock() and Unlock() in this case)

    This becomes even more helpful when you are trying to use multiple functions on the embedded field (that implemement an interface like io.ReadWriter).

    点赞 评论 复制链接分享

相关推荐