为了账号安全,请及时绑定邮箱和手机立即绑定

无法将类型字符串用作 sql.NullString

无法将类型字符串用作 sql.NullString

Go
红糖糍粑 2022-05-23 16:13:41
我正在创建一个gorm模型// Day is a corresponding day entrytype Day struct {    gorm.Model    Dateday   string         `json:"dateday" gorm:"type:date;NOT NULL"`    Nameday   string         `json:"nameday" gorm:"type:varchar(100);NOT NULL"`    Something sql.NullString `json:"salad"`    Holyday   bool           `json:"holyday"`}我正在使用sql.NullString该字段,Something因为它可能为 NULL。因此,当我尝试执行一个典型gorm示例来验证我的设置是否有效时:    db.Create(&Day{        Nameday:     "Monday",        Dateday:     "23-10-2019",        Something:   "a string goes here",        Holyday:      false,    })我得到:不能在字段值中使用“一个字符串”,(类型字符串)作为类型 sql.NullStringSomething鉴于字段可能为 NULL,我应该为该字段使用什么类型?
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

该sql.NullString类型实际上不是字符串类型,而是结构类型。它定义为:


type NullString struct {

    String string

    Valid  bool // Valid is true if String is not NULL

}

因此,您需要这样初始化它:


db.Create(&Day{

    Nameday:     "Monday",

    Dateday:     "23-10-2019",

    Something:   sql.NullString{String: "a string goes here", Valid: true},

    Holyday:     false,

})

作为替代方案,如果您想在初始化可空字符串时继续使用更简单的语法,您可以声明自己的可空字符串类型,让它实现sql.Scanner和driver.Valuer接口,并利用空字节来表示NULL值。


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 *String) Scan(src interface{}) error {

    switch v := src.(type) {

    case string:

        *s = String(v)

    case []byte:

        *s = String(v)

    case nil:

        *s = StringNull

    }

    return nil

}

这样,如果您将字段声明Something为类型MyString,则可以按照最初的预期对其进行初始化。


db.Create(&Day{

    Nameday:     "Monday",

    Dateday:     "23-10-2019",

    // here the string expression is an *untyped* string constant

    // that will be implicitly converted to MyString because

    // both `string` and `MyString` have the same *underlying* type.

    Something:   "a string goes here",

    Holyday:     false,

})

请记住,这仅适用于无类型常量,一旦你有一个类型的常量或变量string,为了能够将它分配给MyString你需要使用显式转换。


var s string

var ms MyString


s = "a string goes here"

ms = s // won't compile because s is not an untyped constant

ms = MyString(s) // you have to explicitly convert


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号