使用sql.NullString 類型的欄位建立GORM 模型時,嘗試使用字串值初始化欄位會導致錯誤:
cannot use "a string goes here", (type string) as type sql.NullString in field value
sql.NullString類型實際上不是字串類型,而是封裝了字串和布林值的結構體指示字串是否有效(非NULL)的標誌。要初始化 sql.NullString 字段,必須使用結構體值初始化它,而不是字串值。
以下程式碼示範如何正確初始化sql.NullString 欄位:
<code class="go">db.Create(&Day{ Nameday: "Monday", Dateday: "23-10-2019", Something: sql.NullString{String: "a string goes here", Valid: true}, Holyday: false, })</code>
或者,可以定義自訂可為空字串類型,該類型實作sql.Scanner 和driver.Valuer 介面並使用空位元組來表示NULL 值。使用此自訂類型,可以使用原始語法來初始化可為空的字串欄位。
自訂類型:
<code class="go">type MyString string const MyStringNull MyString = "\x00" // implements driver.Valuer, will be invoked automatically when written to the db func (s MyString) Value() (driver.Value, error) { if s == MyStringNull { return nil, nil } return []byte(s), nil } // implements sql.Scanner, will be invoked automatically when read from the db func (s *MyString) Scan(src interface{}) error { switch v := src.(type) { case string: *s = MyString(v) case []byte: *s = MyString(v) case nil: *s = MyStringNull } return nil }</code>
用法:
<code class="go">db.Create(&Day{ Nameday: "Monday", Dateday: "23-10-2019", // no need for explicit typing/conversion Something: "a string goes here", Holyday: false, })</code>
以上是如何在 GORM 中初始化 sql.NullString 欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!