V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
livenux

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

  •  
  •   livenux · Jul 13, 2022 · 2707 views
    This topic created in 1392 days ago, the information mentioned may be changed or developed.

    比如说我在 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
    }
    
    5 replies    2022-07-14 10:17:27 +08:00
    rrfeng
        1
    rrfeng  
       Jul 13, 2022 via Android
    可以考虑拆成 dao dto vo 啥的,照着 java 的来。
    ganymedenil590
        2
    ganymedenil590  
       Jul 13, 2022 via Android
    分层然后定义不同的结构体,虽然会有很多你这里写的结构体互相赋值的情况,但结构清楚。如果你嫌这种方式写麻烦可以按自己需求写个生成器自动生成也可以。
    shxxy
        3
    shxxy  
       Jul 13, 2022 via Android
    你想要干净利落那就反射啦,ORM 作用就是把你的数据结构映射到数据库的数据结构里去,你这个框架要加在 ORM 和 nosql 操作的上层,本质也是把底层的数据结构映射到上层逻辑,所以如果你不嫌麻烦,你可以手动写一大堆结构体,不然就花点时间了解下反射,用反射来做映射
    wangx0102
        4
    wangx0102  
       Jul 14, 2022 via Android
    可以用反射实现吧
    stach
        5
    stach  
       Jul 14, 2022
    放弃 ORM ,就不需要这些 Tag 了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5712 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 08:50 · PVG 16:50 · LAX 01:50 · JFK 04:50
    ♥ Do have faith in what you're doing.