dongzaocheng3214 2016-04-18 21:22
浏览 117
已采纳

为什么要在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 2016-04-18 23:50
    关注

    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).

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵