跨多个结构使用相同的方法

Use same methods across multiple structs

我有一个场景,我有一些结构来模拟我的数据库模式。我想要的是向所有这些结构添加一些方法,以便我可以在我的处理程序中使用它们。我使用组合实现了这一点,但我的父结构中有日志实用程序,它没有在子结构中初始化,因此我收到以下错误

panic: runtime error: invalid memory address or nil pointer dereference

假设我的父结构如下所示

    //Model is the top level model instance
    type Model struct {
        utils *utils.Util
    }
    
    // New creates an instance of model
    func New(utils *utils.Util) *Model {
        return &Model{utils: utils}
    }
    
    // Initialize creates/opens database
    func (m *Model) Initialize() bool {
        db, err := m.openConnection()
        if err != nil {
            return false
        }
        defer db.Close()
        ctx, cancelfunc := context.WithTimeout(context.Background(), 5*time.Second)
        defer cancelfunc()
        err = db.PingContext(ctx)
        if err != nil {
            m.utils.Log.Errorf("FAILED::could not ping database because of %s", err.Error())
            return false
        }
        return true
    }

我的子结构如下所示

// User act as model for database
type User struct {
    *Model
    FirstName    string `sql:"firstName"`
}

在我的处理程序方法中,我有以下内容

  user := new(model.User)
  err := user.Initialize()

一切都按预期正常工作,但仅当 PingContext returns 出错时才会抛出错误。我得到的错误如下

panic: runtime error: invalid memory address or nil pointer dereference

当我直接从父结构调用这个方法时,这工作正常。有没有更好的方法来实现我想要实现的目标,或者我做错了什么。请提出建议。

我知道如果从子结构调用该方法,它会抱怨 m.utils 未初始化,因此我收到错误消息,但万一父结构的初始化,我没有收到错误。

您在用户结构中嵌入了一个 *Model,该结构最初为 nil。当您调用 user.Initialize 时,将使用 nil 接收器调用初始化方法。您要么必须将该模型初始化为指向非 nil 结构,要么嵌入非指针。由于您还必须初始化 Model,您可以这样做:

type User struct {
    *Model
    FirstName    string `sql:"firstName"`
}

您必须初始化模型和该模型中的实用程序:

u:=new(model.User)
u.Model=model.New(utils)
u.Initilize()