在 Go 中处理解耦的最佳方法是在两个不同的包中使用类似的结构,但结构中的子项使其变得困难?
在 Go 中处理解耦的最佳方法是使用类似结构但具有不同子项的两个不同包。这种方法可以有效地将代码分离,提高可维护性和模块化程度。然而,当结构中的子项变得复杂时,这种解耦方法可能会变得困难。在这种情况下,可以考虑使用接口和多态的概念来解决问题。通过定义通用的接口类型,可以将不同的结构类型进行统一处理,从而实现更灵活的解耦方式。这种方法在 Go 中被广泛使用,可以让代码更加可扩展和可重用。
问题内容
我相对较新,并且一直在进行大规模重写,试图尽可能减少我的依赖关系图。我对我得到它的地方感到非常满意,但是有一个部分我不知道如何最好地处理。如果答案是“两者之间会有这种依赖性”,那也很好,我只是在寻找一个好的方法,而不是期待奇迹。
所以下面我有两个包,a
和 b
,它们都有相同的结构。通常你可以在 main 中将一个转换为另一个,但每个都有一个子项,它也是一个结构体,这会阻止 go 允许它,即使子项具有相同的签名。
一种方法是在 b 的结构中引用 a.tzconfig 并让其存在依赖关系,但这就是我想要摆脱的。
我想另一种方法是创建一个接口,然后通过方法获取 loc 的值,我认为这可行,但我还没有尝试过,因为这意味着为只是数据结构的东西创建方法(实际结构有很多项目,为了简单起见,我在这里将其简化为必需品),这似乎有点矫枉过正。
我可以将 tzconfig 移至第三个模块,这样它们都会引用该模块,而不是一个引用另一个模块,这就是我所想到的。
所以我的问题是,从有真实经验的人那里,在 go 中处理这种情况的最佳方法是什么?
我应该提到,它们重复结构的原因只是因为我试图打破它们之间的依赖关系,原始代码只是在一个包中包含该结构,而另一个包引用它。
package a type cfg struct { addr string loc tzconfig } type tzconfig struct { string string tz *time.location `validate:"nodescent"` } func getcfg() cfg { t, _ := time.loadlocation(`mst`) return cfg{ addr: "abc", host: "a.bc.d", loc: config.tzconfig{ string: "mst", tz: t, }, } }
package b type cfg struct { addr string loc tzconfig } type tzconfig struct { string string tz *time.location `validate:"nodescent"` } func dosomethingwithconfig(c cfg) { fmt.println(c) }
package main main() { c := a.GetCfg() d := b.DoSomethingWithConfig(b.Cg(c)) fmt.Println(d) }
解决方法
恕我直言,@burakserdar 提供的建议非常好,非常适合您的场景。我用这种方式重写了代码。
package common
package common import "time" type cfg struct { addr string loc tzconfig } type tzconfig struct { string string tz *time.location `validate:"nodescent"` }
这里应该放置常用的结构体、函数、方法等。
package a
package a import ( "dependencies/common" "time" ) type cfg struct { common.cfg host string } func getcfg() cfg { t, _ := time.loadlocation(`mst`) return cfg{ cfg: common.cfg{ addr: "abc", loc: common.tzconfig{ string: "mst", tz: t, }, }, host: "a.bc.d", } }
这里有与 a
包相关的特定代码,它继承了 common
包的共享代码,如 import
部分所示。
请注意,我使用结构嵌入功能来获取 common
包中定义的共享字段。
package b
package b import ( "dependencies/common" "fmt" ) func dosomethingwithconfig(c common.cfg) string { return fmt.sprint(c) }
这里,没有什么特别值得一提的。
package main
package main import ( "dependencies/a" "dependencies/b" "fmt" ) func main() { c := a.GetCfg() d := b.DoSomethingWithConfig(c.Cfg) fmt.Println(d) }
这里,代码应该非常简单。我导入了 a
和 b
包来利用它们的功能。
我想再次澄清,这是一个主观主题,因此没有灵丹妙药的解决方案。对我来说,看起来整洁、清晰。我肯定会选择这种方式。请告诉我并谢谢!
以上是在 Go 中处理解耦的最佳方法是在两个不同的包中使用类似的结构,但结构中的子项使其变得困难?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

OpenSSL,作为广泛应用于安全通信的开源库,提供了加密算法、密钥和证书管理等功能。然而,其历史版本中存在一些已知安全漏洞,其中一些危害极大。本文将重点介绍Debian系统中OpenSSL的常见漏洞及应对措施。DebianOpenSSL已知漏洞:OpenSSL曾出现过多个严重漏洞,例如:心脏出血漏洞(CVE-2014-0160):该漏洞影响OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻击者可利用此漏洞未经授权读取服务器上的敏感信息,包括加密密钥等。

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

本文讨论了GO编程中的GO FMT命令,该命令将代码格式化以遵守官方样式准则。它突出了GO FMT在维持代码一致性,可读性和降低样式辩论方面的重要性。 FO的最佳实践

本文介绍在Debian系统下监控PostgreSQL数据库的多种方法和工具,助您全面掌握数据库性能监控。一、利用PostgreSQL内置监控视图PostgreSQL自身提供多个视图用于监控数据库活动:pg_stat_activity:实时展现数据库活动,包括连接、查询和事务等信息。pg_stat_replication:监控复制状态,尤其适用于流复制集群。pg_stat_database:提供数据库统计信息,例如数据库大小、事务提交/回滚次数等关键指标。二、借助日志分析工具pgBadg

后端学习路径:从前端转型到后端的探索之旅作为一名从前端开发转型的后端初学者,你已经有了nodejs的基础,...
