最近踩到一個
buffalo-pop ORM 的一個雷,範例如下:
type Job struct {
ID string `json:"id" db:"id"`
JobCreateType JobCreateType `json:"job_create_type" db:"job_create_type"`
FileName string `json:"file_name" db:"file_name"`
Status JobStatus `json:"status" db:"status"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
JobSourceInfo *JobSourceInfo `json:"source_info" has_one:"job_source_infos" fk_id:"job_id"`
}
type JobSourceInfo struct {
ID string `json:"id" db:"id"`
JobID string `json:"job_id" db:"job_id"`
SourceURL string `json:"source_url" db:"source_url"`
}
一個 Job Struct 裡面有一個 Embedded Struct JobSourceInfo ,在資料庫裡面是 1 - 1
的關係,一開始產生 Job 時,並不預期一定會產生 JobScoureInfo,這時我們都會宣告為指標,理論上只要如下面範例,檢查是不是
nil 就能知道這個物件有沒被產生。
var ji *JobSourceInfo
if ji == nil {
ji = new(JobSourceInfo)
// do stuff
}
但是.... Buffalo 的 ORM 的 Eager func 卻自作主張的幫我產生了一個
Empty Struct ,原本只需要檢查,指標是否為 nil ,但是現在卻得檢查是否為 empty Struct...
那讓我們來看看檢驗 Empty Struct 有幾種方法?