美文网首页
go time.Time 零值处理的方式

go time.Time 零值处理的方式

作者: Newzer | 来源:发表于2022-09-21 14:55 被阅读0次

1.在定义表结构式经常需要用到 time.Time 的类型, 例如:
PayTime time.Time json:"pay_time" gorm:"default:null; comment:用户支付时间"
如果在创建记录的时候,不想设置此字段,又不想数据库中插入 "0001-01-01T00:00:00Z",则可以在gorm tag 里加上 default:null; 解决问题

2.在接口返回数据时,由于查询出的数据必须绑定到结构体,所以也会出现


image.png

这个格式对前端同学不够友好,前端同学希望当没有时间时为null

当我试图用类型别名来重载 time 包中的 MarshalJSON() 时


image.png

会报:非本地方法不能重载,类型别名只能为本地包添加独有方法


image.png

经过一番苦思,最终通过修改 time 包的 MarshalJSON()方法来搞定:
if t.IsZero() {
return []byte("null"), nil
}


image.png

由于第一次改标准库,心里还有一点点慌......

最后在大神的指导下不改标准库的情况下完美解决了该问题
package pkg

import "time"

type MyTime time.Time

var emptyTime = MyTime{}

func (t MyTime) MarshalJSON() ([]byte, error) {
if t == emptyTime {
return []byte("null"), nil
}

realT := time.Time(t)//将 MyTime 类型转化为 time.Time类型
return realT.MarshalJSON()

}

附:解决这个问题的过程中,我弄清了类型别名和类型再定义相关的内容:
类型别名:
type A = B:A和B的类型是一样的,包括他们所拥有的方法,A可以调用B的方法,可以为基本类型添加自己的方法,但不能未远程包定义自己的方法

类型再定义:
Type C D:C和D是不同的类型,C不能调用D的方法,相当于完全重新定义一个类型,但是新旧类型之间可以相互转化,新类型转化为旧类型之后就可以调用旧类型的方法,所以可以实现类似多态的效果

另外判断是否是零值,可以用两种方式:
无法获取time.Time 的值时用:
nilTime := time.Time{}

可以获取到值时用:
t.IsZero()

所以下面这两种用法是一样的:
func (t MyTime) MarshalJSON() ([]byte, error) {
realT := time.Time(t)
if realT.IsZero() {
return []byte("null"), nil
}
return realT.MarshalJSON()
}

func (t MyTime) MarshalJSON() ([]byte, error) {
var emptyTime MyTime
if t == emptyTime {
return []byte("null"), nil
}

realT := time.Time(t)
return realT.MarshalJSON()

}

相关文章

  • go time.Time 零值处理的方式

    1.在定义表结构式经常需要用到 time.Time 的类型, 例如:PayTime time.T...

  • Go Error处理

    错误处理 Go语言的错误设计是通过返回值的方式来让调用者对错误进行处理,通常我们的处理是对error类型的返回值进...

  • 译文:Don't just check errors, hand

    Errors 只是值 我花了很多时间来思考在 Go 程序中处理错误的最佳方式。我真的想要有一个处理错误的单一方式。...

  • 错误处理的几种套路

    错误处理的几种套路 在Go语言中并不支持抛出异常的方式提示错误,而是通过支持多返回值的方式返回error接口、并且...

  • Go Nil

    Go语言数据类型中,布尔类型的零值(初始值)为false,数值类型的零值为0,字符串类型的零值为空字符串""。 对...

  • 08. 零值

    Go语言的变量在没有明确初始化时,会有一个 零值,即默认值。不同类型的变量,零值是不同的。 数值型 零值为 0布...

  • Go语言中的零值

    Go语言中的零值是变量没有做初始化时系统默认设置的值。var b bool // bool型零值是falseva...

  • golang- 等待组 sync.WaitGroup

    使用 go 语言提供的方式处理:sync.WaitGroup

  • go 的零值总结

    面试中经常遇到,特此总结一下。 bool int float string 零值 输出: 指针 零值 slice ...

  • go 语言基础--函数

    1、函数 和C语言类型,Go语言也有函数的概念,语法如下: 2 参数和返回值 2.1 返回值 go 语言可以返回零...

网友评论

      本文标题:go time.Time 零值处理的方式

      本文链接:https://www.haomeiwen.com/subject/bbvwortx.html