Golang Go语言中关于 accept interfaces, return structs

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言中关于 accept interfaces, return structs

这句话出自 https://en.m.wikipedia.org/wiki/Robustness_principle

但是标准库也经常是返回 interface ,最简单就是 error,底层对上层屏蔽自己的实现细节,这不是很自然么

这句话我看很多文章都是在拿工厂模式说事,是不是只针对部分场景,如果上层只是想要一组通用的行为,底层返回 interface 没啥问题吧


更多关于Golang Go语言中关于 accept interfaces, return structs的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

https://github.com/go-proverbs/go-proverbs.github.io/issues/37
rob pike 并不 100%赞同这句话并拒绝将其加入 golang proverbs

更多关于Golang Go语言中关于 accept interfaces, return structs的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  1. 我没发现你这个链接里有标题里这段话,如是来源具体历史版本,请提供;
    2. Robustness principle 实质上导致了世纪初的 Web 生态大混乱:因为不是所有人都严格遵守之,而兼容性测试并未进行广泛配合;
    3. 我认为最优兼容性实践是在所有未定义行为上人为施加随机性,依据是耗散结构理论。

最近在看 docker 源码,这种设计挺普遍的,方法的返回值类型是 interface ,实际 return 的是实现了 interface 的结构体实例。我觉着这种思路挺好啊,对外部屏蔽内部的实现细节

be conservative in what you do, be liberal in what you accept from others 算是这句话的口语化流传版本吧

过早抽象不好

emmm 其实我想问一下,不返回接口的话你们都是怎么 mock 的…?

在Golang(Go语言)中,关于“accept interfaces, return structs”这一设计原则,其实体现的是Go语言对接口和结构体使用的最佳实践。

首先,接受接口作为参数可以提高代码的灵活性和可扩展性。接口定义了对象的行为,而不需要关心对象的具体类型。这意味着你可以传递任何实现了该接口的对象,从而使得函数或方法能够处理多种不同类型的输入。这种设计使得代码更加通用,易于维护和扩展。

其次,返回结构体则提供了具体的、类型安全的结果。结构体是Go语言中用于表示复杂数据结构的类型,它们包含了多个字段,每个字段都可以存储不同类型的数据。返回结构体可以让调用者明确地知道返回的数据类型和结构,从而更方便地进行后续处理。

此外,这种设计原则还有助于实现依赖注入和单元测试等现代软件开发实践。通过接受接口作为参数,你可以轻松地替换掉实际的实现,以便进行单元测试或模拟依赖项。而返回结构体则确保了测试结果的明确性和可预测性。

总之,“accept interfaces, return structs”是Go语言中一种非常实用的设计原则,它有助于提高代码的灵活性、可扩展性和可维护性。在实际开发中,我们应该根据具体的需求和场景来合理地运用这一原则,以编写出更加高效、健壮和易于维护的代码。

回到顶部