2020年4月16日 星期四

Go 小教室 - 如何檢驗 Go struct isEmpty




最近踩到一個 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 有幾種方法?