1 回答
TA贡献1806条经验 获得超5个赞
您应该实现sql.Scanner和driver.Valuer接口。
像这样的东西:
func (j *jsonTime) Scan(src interface{}) error {
if t, ok := src.(time.Time); ok {
j.Time = t
}
return nil
}
func (j jsonTime) Value() (driver.Value, error) {
return j.Time, nil
}
这是必要的,因为和其他一些 go ORMdatabase/sql使用的包gorm(如果不是全部)只为少数类型提供开箱即用的支持。
大多数支持的类型是语言的基本内置类型,如string, int,bool等。通过扩展它还支持任何自定义用户定义类型,其基础类型是上述基本类型之一,然后支持[]byte类型和相关sql.RawBytes类型,以及最后,该time.Time类型也支持 ootb。
您可能想要写入或从数据库读取的任何其他类型都需要实现上述两个接口。在将列的值解码为一种受支持的类型后sql.Scanner,会自动调用'Scan方法(这就是为什么您需要键入 assert 反对而不是反对,比如说)。's方法在驱动程序将其编码为对目标列有效的格式之前自动调用(这就是为什么您可以直接返回而不是自己进行编码)。time.Time[]bytedriver.ValuerValuetime.Time
请记住,
type jsonTime struct {
time.Time
}
甚至
type jsonTime time.Time
声明了一个不等于的新类型,这就是为什么它没有被包拾取。time.Timedatabase/sql
- 1 回答
- 0 关注
- 187 浏览
添加回答
举报
