Go
发布时间:2022-04-09 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了【Go语言社区】接受 interface 参数,返回 struct 在 go 中意味着什么,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
注意细节
在之前的
文章中,我提到了
一个关于
accept interfaces,return structs的参
考指南,在查看同事
代码的时候经常会被问“为什么”。特别是这不是
一个必须遵守的规则。这个想法的关键点以及理解什么时候妥协,在于维护项目灵活性和避免抢占抽象(译者注:“Preemptive abstractions” 并发系统中连续组件的轻量级验证方案的一种抽象技术)之
间的平衡。
抢占抽象让系统变得复杂
软件工程师喜欢抽象。个人看法,我从未看到过
一个同事参与写
代码超过他为了某个事务建立抽象多。Go 语言从结构中抽象出接口,这种处理方式会产生嵌入复杂性。遵循
你并不需要它软件设计理念,如果不需要就没有理由
增加复杂性。
一个常见的返回接口的理由是让
用户把注意力放在
函数所提供的 API 上。在 Go 中因为隐含实现了接口,所以这并不需要。返回结构的公共
函数就成为那个API。
一些语言需要你预见每
一个可能从未用过的接口。隐含实现接口
一个最大的好处,就是允许你在后面实际需要的时候优雅的抽象事务,而不
是需要你预先抽象出来。
使用者眼中的需求
你怎么知道什么时候需要抽象?对于返回类型来说,比较容易。你是写
函数的人,所以你确切的知道什么时候需要抽象返回值。
对于输入参数来说,是否需要不在
你的控制范围之内。你也许认为
你的数据模型足够了,但是
一个用户可能需要和某些
属性封装一下。如果可能的话,可以预想一下每个
调用你的函数的情况,但这是比较困难的。这种可以控制
输出,但是不能预期
用户输入的不平衡的状况产生了一种强烈的偏见,抽象输入而不是
输出。
去掉无用的代码细节
简化的另
一个方面是
去除不需要的细节。类似
菜单函数:给
一个输入然后你得到
一个蛋糕!不需要列出做蛋糕的材料。同样的,
函数也不需要列出不使用的输入参数。下面的
函数你会怎么想?
func
addnumbers(a
int,b
:rgb(166,s
String)
int{
returna + b}
对于大多数程序员来说很明显参数
s是不需要的。当参数是结构的时候就不那么明显了。
typeDatabase
struct{ }
func(d *DatabasE)
AddUser(s
String) {...}
RemoveUser(s
NewUser(d *Database,firstName
String,lastName
String) { d.
AddUser(firstName + lastName)}
就像
一个写满了配料的
菜单一样,NewUser 输入参数是
一个有很多
功能的 Database 对象。实际上只需要 AddUser 但是却得到了额外的 RemoveUser。接口允许我们在创建
函数的时候只依赖我们需要的
功能。
typeDatabaseWriter
interface{
AddUser(
String)}
NewUser(d DatabaseWriter,116);">AddUser(firstName + lastName)}
Dave Cheney 在写
接口隔离原则的时候也提到了
这一点。他还描述了一些关于限制输入的其他好处,值得读一下。概括一下就是:
我会按照这个思想,重新
考虑上面的
函数 add
numbers,很明显不需要参数 s 字符串,
函数 NewUser 同样也不需要
一个包括 RemoveUser 的Database参数。
总结理由和审查例外情况
主要的理由如下:
这些理由也允许有例外的情况。例如,如果
你的函数实际上返回多种类型而不是
一个接口。同样地,如果
函数是私有的,你能控制输入参数,会偏向于不
要做抢占抽象。对于第三条规则,go 没有方式可以抽象出结构成员的值。 所以,如果
你的函数需要访问结构成员(并且不只是结构
方法),那么你必须接受结构作为参数。
问答
提问:如果 Database 有很多
方法,比如 20 个,那么如何处理呢?
[BACkcolor=rgba(24,241,24,0.1)]
本文由 GCTT
原创翻译,
Go语言中文网首发。也想加入译者行列,为开源做一些自己的贡献么?欢迎加入
GCTT!
翻译工作和译文发表仅用于学习和交流目的,翻译工作遵照
CC-BY-NC-SA 协议规定,如果我们的工作有侵犯到您的权益,请及时联系我们。
欢迎遵照
CC-BY-NC-SA 协议规定转载,敬请在正文中标注并保留原文/译文
链接和作者/译者等信息。
文章仅代表作者的知识和看法,如有不同观点,请楼下排队吐槽
大佬总结
以上是大佬教程为你收集整理的【Go语言社区】接受 interface 参数,返回 struct 在 go 中意味着什么全部内容,希望文章能够帮你解决【Go语言社区】接受 interface 参数,返回 struct 在 go 中意味着什么所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。