Golang Go语言中问一个新手问题,一个 Golang Go语言的 struct 使用了 json fields,怎么在导入的时候加入其他的 fields?

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

比如说我在 models 里面定义了一个 user struct 绑定了 json fields ,数据操作层可能有不同的实现,因为数据库可能有多个不同的实现,比如说用 orm 来进行数据库的 curd 要增加 orm 的 fields ,使用 mongodb 的 drver 来进行 nosql 的的 curd 要增加 mongodb 的 bson 的 fields.

想做到操作层和 model 层的分离,有什么好的项目实践方法?

写了个 demo ,发现实现起来太笨了。

package repo

import ( “context” “time”

"gin-base/models"
"github.com/uptrace/bun"

)

// bunUserRepository bun ORM user struct type bunUserRepostiory struct { DB *bun.DB }

type bunUser struct { bun.BaseModel bun:"table:users" ID uint64 bun:"id,pk,autoincrement" Username string bun:"username,notnull" Password string bun:"password,notnull" Nickname string bun:"nickname" CreateAt time.Time bun:"create_at,nullzero,notnull,default:current_timestamp" UpdateAt time.Time bun:"update_at,nullzero,notnull,default:current_timestamp" DeleteAt time.Time bun:"delete_at,soft_delete,nullzero,notnull,default:current_timestamp" }

func (bu *bunUser) Model() (mu *models.User) { mu.ID = bu.ID mu.Username = bu.Username mu.Password = bu.Password mu.Nickname = bu.Nickname mu.CreateAt = bu.CreateAt mu.UpdateAt = bu.UpdateAt mu.DeleteAt = bu.DeleteAt return mu

}

func NewBunUserRepostiory(DB *bun.DB) *bunUserRepostiory { return &bunUserRepostiory{DB: DB} }

func (b *bunUserRepostiory) Create(ctx context.Context, newUser *bunUser) (u *models.User, err error) { _, err = b.DB.NewInsert().Model(newUser).Exec(ctx) u = newUser.Model() return }


Golang Go语言中问一个新手问题,一个 Golang Go语言的 struct 使用了 json fields,怎么在导入的时候加入其他的 fields?

更多关于Golang Go语言中问一个新手问题,一个 Golang Go语言的 struct 使用了 json fields,怎么在导入的时候加入其他的 fields?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

可以考虑拆成 dao dto vo 啥的,照着 java 的来。

更多关于Golang Go语言中问一个新手问题,一个 Golang Go语言的 struct 使用了 json fields,怎么在导入的时候加入其他的 fields?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


分层然后定义不同的结构体,虽然会有很多你这里写的结构体互相赋值的情况,但结构清楚。如果你嫌这种方式写麻烦可以按自己需求写个生成器自动生成也可以。

你想要干净利落那就反射啦,ORM 作用就是把你的数据结构映射到数据库的数据结构里去,你这个框架要加在 ORM 和 nosql 操作的上层,本质也是把底层的数据结构映射到上层逻辑,所以如果你不嫌麻烦,你可以手动写一大堆结构体,不然就花点时间了解下反射,用反射来做映射

可以用反射实现吧

放弃 ORM ,就不需要这些 Tag 了。

在Go语言中,当使用结构体(struct)与JSON进行序列化和反序列化时,如果需要在导入(反序列化)时加入额外的字段,你可以采取以下几种方法:

  1. 使用匿名字段或嵌套结构体:你可以设计一个更大的结构体,包含原有的结构体作为匿名字段或嵌套结构体,并在外层结构体中定义额外的字段。这样,在反序列化时,JSON解析器会将匹配的字段填充到相应的结构体中。

  2. 使用json标签忽略不需要的字段:如果JSON数据中有些字段在原始结构体中不存在,你可以通过在结构体字段上使用json:"-"标签来忽略这些字段。反序列化时,这些字段会被忽略,不会引发错误。

  3. 自定义Unmarshal方法:如果需要对JSON数据进行更复杂的处理,可以实现自定义的UnmarshalJSON方法。在这个方法中,你可以完全控制如何将JSON数据转换为结构体实例,包括如何处理额外的字段。

  4. 使用map[string]interface{}作为中间类型:首先,将JSON数据反序列化为一个map[string]interface{},然后根据需要提取数据并填充到目标结构体中。这种方法提供了最大的灵活性,但也需要手动处理数据转换。

选择哪种方法取决于你的具体需求,比如数据结构的复杂性、对性能的考虑以及对代码可读性的要求。

回到顶部