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