首頁  >  文章  >  後端開發  >  如何在 GORM 中初始化 sql.NullString 欄位?

如何在 GORM 中初始化 sql.NullString 欄位?

Susan Sarandon
Susan Sarandon原創
2024-11-05 15:59:02795瀏覽

How to Initialize a sql.NullString Field in GORM?

無法使用String 類型作為SQL.NullString

問題

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn