当前位置: 首页 > 面试题库 >

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

刁丰羽
2023-03-14
问题内容

在下面的代码中,我展示了我认为在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

问题答案:

值得阅读有关“嵌入到有效Go中”的部分。

一个常见的示例是具有Mutex的结构/映射。

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)时,这将变得更加有用。



 类似资料:
  • 问题内容: 在Golang中,我们将结构体与接收器方法结合使用。到这里为止一切都很完美。 我不确定什么是接口。我们在结构中定义方法,如果要在结构上实现方法,则无论如何都要在另一个结构下再次编写该方法。 这意味着接口似乎只是方法定义,仅占用了页面上多余的空间。 有没有解释我为什么需要接口的示例? 问题答案: 接口太大了,不能在这里给出全面的答案,但是有些事情需要弄清楚它们的用途。 接口是一种 工具

  • 本文向大家介绍为什么要在R中使用set.seed?,包括了为什么要在R中使用set.seed?的使用技巧和注意事项,需要的朋友参考一下 set.seed的使用是为了确保我们获得相同的随机结果。如果我们为R或任何统计软件中的任何任务随机选择一些观测值,则它始终会产生不同的值,这是由于随机化而发生的。如果我们想保留在第一次随机选择时产生的值,则可以通过在随机化之后将它们存储在一个对象中来实现,或者可以

  • 问题内容: 我只是从Angular开始。阅读Google文档中的服务示例,我只是想知道为什么您会选择使用服务而不是将变量和函数正确地保留在控制器中? 在这种情况下,您何时选择使用服务? 问题答案: 我认为主要原因是: 在控制器之间持久并共享数据。 IE:您创建了一个从数据库中获取数据的服务,如果将其存储在控制器中,一旦更改为另一个控制器,数据将被丢弃(除非您将其存储在$ rootScope中,但这

  • 问题内容: 我很好奇,将框架与PHP一起使用有什么优缺点? 从版本3开始,我一直在使用PHP。无论如何,我从未使用过任何可用于PHP的框架,所以我错过了什么? 问题答案: 框架使您从低级详细信息中抽象出来,使您的工作效率更高,并保护您免受低级错误(例如防止SQL注入攻击)的侵害。 一个好的PHP框架会迫使您分离您的关注点并实现经过验证的体系结构,从而最终改善您的设计,并使您的代码更易于阅读和维护以

  • 本文向大家介绍为什么要使用 kafka,为什么要使用消息队列?相关面试题,主要包含被问及为什么要使用 kafka,为什么要使用消息队列?时的应答技巧和注意事项,需要的朋友参考一下 缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性:项目开始的

  • 我正在使用golang和Postgresql。 这里说,对于不返回行(插入、删除、更新)的操作,我们应该使用 如果函数名包括Query,则它被设计为询问数据库的问题,并将返回一组行,即使它是空的。不返回行的语句不应使用查询函数;它们应该使用Exec()。 然后它在这里说: Go在封面下为您创建准备好的语句。一个简单的db。例如,查询(sql、参数1、参数2)的工作原理是准备sql,然后用参数执行它