在做web后端开发时,往往免不了不同结构体之间的拷贝。这种场景虽然难度很低,但经常有,占据了不少代码量,所以大厂总喜欢把这块外包给外面人做。
前些日子发现个copir库,可以方便进行不同类型结构体的copy。 具体详情可以查看
Go 每日一库之 copier - 孤雨的文章 - 知乎 https://zhuanlan.zhihu.com/p/113301827
这个copier虽然方便,但对类型转化还是太弱了,同时要求必须字段的名字必须一模一样。
而在大型项目,代码多人写,命名风格也是千奇百怪,尤其是一些祖传的项目,大家懂得都懂,就不详细展开了。
比如 遇到这种类似情况,copier库就捉鸡了。
这两个结构体表达的意思都差不多,但 item 命名不一样, userid和pubtime 类型不一样,这时候copier就难顶了。
为了解决这个问题,笔者于是扩展了这个库,实现可以通过指定tag 来实现字段对应复制,大大增加了灵活性。
上面这个问题,就可以采用tag, 再实现对应的方法 来解决
如上所述,给类型的成员设定一个tag "mson"(这个可以自己随意指定)。
成员字段里 item, 名字不一样,但可以把mson 都指定为相同的“Item_string",。
对于不同类型的成员,可以让 structB 实现 structA里UserID,PubTime里 mson指定的方法, 这样可以自己设计类型转化的过程。
这里 mson 的命名风格原因:
如果是多种不同类型的结构体的复制 ,用 {成员名}_{类型名},比较好区分。
当然这里只是建议,如果场景不复杂,可以写的简单点。
扩展项目地址:
同时还支持了深拷贝, go mod (jinzhu 近半年好像没管这项目了)
原来copier 地址