理解“Unable to use type string as sql.NullString”错误
在 Go 中,gorm.Model 提供了使用的功能使用 SQL 的数据库。使用 GORM 创建数据库模型时,必须适当声明数据类型以匹配其相应的 SQL 数据类型。尝试将字符串值分配给已声明为 sql.NullString 的字段时,会出现“无法使用字符串类型作为 sql.NullString”错误。
sql.NullString: A Struct, Not String
sql.NullString 类型本身不是字符串类型,而是结构体。它包含两个字段:String(实际字符串值)和 Valid(一个布尔值,指示字符串值是否有效或 NULL)。
正确初始化 sql.NullString
要正确初始化 sql.NullString 值,请提供一个 sql.NullString 结构,并适当设置 String 和 Valid 字段。例如:
<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 和驱动程序。估价器接口。通过利用空字节,您可以发出 NULL 值信号。
<code class="go">type MyString string const MyStringNull MyString = "\x00" // Implement driver.Valuer to convert to database value func (s MyString) Value() (driver.Value, error) { if s == MyStringNull { return nil, nil } return []byte(s), nil } // Implement sql.Scanner to convert from database value func (s *MyString) Scan(src interface{}) error { // Handle different types 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", Something: "a string goes here", // implicitly converted to MyString Holyday: false, })</code>
注意: 将类型化字符串值分配给自定义可为空字符串类型时,可能需要显式转换。
以上是为什么 Go 的 GORM 库会出现'Unable to use type string as sql.NullString”错误,如何解决?的详细内容。更多信息请关注PHP中文网其他相关文章!