前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2020年7月7日 Go生态洞察:保持模块兼容性

2020年7月7日 Go生态洞察:保持模块兼容性

作者头像
猫头虎
发布2024-04-09 15:31:06
890
发布2024-04-09 15:31:06
举报

2020年7月7日 Go生态洞察:保持模块兼容性 🌱

摘要:🐆 猫头虎博主在此,携带Go生态的最新洞察!今天我们要深入挖掘如何在Go语言中保持模块的兼容性。作为技术探索的狂热者,我将带领大家一探究竟,了解如何在添加新功能时,保持现有代码的稳定性。跟随我,一起探索Go的奥秘吧!🐾

引言 📘

亲爱的读者们,这篇博客是Go模块系列的第5部分。

我们将深入探讨如何在不破坏现有用户代码的前提下,对Go模块进行迭代和升级。

向函数添加内容 🛠️

对于函数参数的变更,我们提出了一种常见但不适用的技术:变参。例如:

代码语言:javascript
复制
func Run(name string, size ...int)

虽然这种方式看似兼容,实际上可能会导致类型不匹配的编译错误。

解决方案:不要修改现有函数签名,而是添加新函数。如context.Context的引入,database/sql包就通过添加新方法来适应:

代码语言:javascript
复制
func (db *DB) QueryContext(ctx context.Context, query string, args ...interface{}) (*Rows, error)

若未来函数可能需要更多参数,可以预先通过单一结构体参数进行设计,如crypto/tls.Dial的做法。

与接口协作 🖇️

当新功能要求修改公开接口时,可以通过定义新接口并在使用旧接口的地方进行类型检查来实现兼容性。例如archive/tar包的处理方式,通过在tar.Reader方法中检查io.Seeker,而不是直接修改io.Reader接口。

添加配置方法 🔧

对于可能改变行为的更新,应通过配置方法而非强制行为变更来实现。例如json.Decoder中添加的Decoder.DisallowUnknownFields方法。

维护结构体兼容性 🏗️

向导出的结构体添加字段通常是向后兼容的,但要确保新字段的零值具有意义。例如,net.ListenConfig的演变。

总结 📝

在设计API时,要考虑其对未来变化的扩展性。当需要添加新功能时,遵循“添加而不是更改或删除”的原则,除了接口、函数参数和返回值外,这些通常不能以向后兼容的方式添加。

本文被猫头虎的Go生态洞察专栏收录,详情点击 这里

参考资料 📚

  • Jean de Klerk and Jonathan Amsterdam, “Keeping Your Modules Compatible”. 7 July 2020.
  • Go官方博客和文档。

下一篇预告 🚀

下一篇博客将聚焦于“Go 1.15版本发布”,我们将探索这个版本的新特性和变化,敬请期待!


知识点

描述

函数兼容性

通过添加新函数而非更改现有函数来保持兼容性

接口兼容性

通过新接口和类型检查来扩展功能

结构体兼容性

添加字段通常兼容,注意新字段的零值

配置方法

通过配置方法引入行为变更,而非强制所有用户适应新行为

设计原则

考虑API的未来扩展性,遵循添加而非更改原则

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2020年7月7日 Go生态洞察:保持模块兼容性 🌱
    • 引言 📘
      • 向函数添加内容 🛠️
        • 与接口协作 🖇️
          • 添加配置方法 🔧
            • 维护结构体兼容性 🏗️
              • 总结 📝
                • 参考资料 📚
                  • 下一篇预告 🚀
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档