【发布时间】:2020-07-17 07:25:04
【问题描述】:
我是一名 PHP 程序员,我刚学了几个星期的 Golang。我正在编写 REST API 以从我的“帖子”表中获取 post 信息。我在posts_controller 中有FindPostByID 方法。这个控制器使用Post struct 这是模型
func (p *Post) FindPostByID(db *gorm.DB, pid uint64) (*Post, error) {
var err error
err = db.Debug().Model(&Post{}).Where("id = ?", pid).Take(&p).Error
if err != nil {
return &Post{}, err
}
if p.ID != 0 {
err = db.Debug().Model(&User{}).Where("id = ?", p.AuthorID).Take(&p.Author).Error
if err != nil {
return &Post{}, err
}
}
return p, nil
}
但是现在我想将方法FindByID 添加到父结构中,例如ParentModel,因为当我有articles_controller 时,我可以在父结构中使用FindByID 方法来获取文章信息。所以我在父结构中有以下代码
type ParentModel struct {
}
func (m *ParentModel) FindByID(db *gorm.DB, uid uint64) (*ParentModel, error) {
var err error
err = db.Debug().Model(ParentModel{}).Where("id = ?", uid).Take(&m).Error
if err != nil {
return &ParentModel{}, err
}
if gorm.IsRecordNotFoundError(err) {
return &ParentModel{}, errors.New("User Not Found")
}
return m, err
}
我改变了Post 结构,如下所示:
type Post struct {
ParentModel
ID uint64 `gorm:"primary_key;auto_increment" json:"id"`
Title string `gorm:"size:255;not null;unique" json:"title"`
Content string `gorm:"size:255;not null;" json:"content"`
Author User `json:"author"`
AuthorID uint32 `sql:"type:int REFERENCES users(id)" json:"author_id"`
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
}
我也更改了posts_controller 中的FindPostByID 方法:
func (server *Server) GetPost(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
pid, err := strconv.ParseUint(vars["id"], 10, 64)
if err != nil {
responses.ERROR(w, http.StatusBadRequest, err)
return
}
post := models.Post{}
postReceived, err := post.FindByID(server.DB, pid)
if err != nil {
responses.ERROR(w, http.StatusInternalServerError, err)
return
}
responses.JSON(w, http.StatusOK, postReceived)
}
当我运行我的程序时,出现错误:Table 'golang_rest_api.parent_models' doesn't exist。
如何使用 PHP 语言这样的继承方法
【问题讨论】:
-
“如何使用 PHP 语言这样的继承方法” Go 没有继承。嵌入不会更改嵌入方法的接收者,它只是“提升”它,这允许您调用它而无需使用字段名称显式限定它。
post.FindByID只是post.ParentModel.FindByID的“语法糖”。 -
golang.org/doc/faq#inheritance - 我的建议:当你在 go 中编写代码时,你需要暂停基于继承的设计思维。越早做,经历的痛苦就越少。
-
感谢您的提前。所以我必须在每个控制器中定义方法来从相应的模型中获取数据,对吗?