使用自定义类型并重写 JSON 序列化和反序列化的方法

Go Web 接口结构体

type User struct {
	Id         uint64         `json:"id"`
	Username   string         `json:"username"`
	Password   string         `json:"password"`
	CreateTime time.Time      `json:"createTime"`
}

接口输出 createTime 字段的时候其格式并不符合我们的习惯。可以使用类型别名的方式重写 JSON 的两个方法:

  • MarshalJSON() ([]byte, error)
  • UnmarshalJSON(data []byte) error
package types

import (
	"fmt"
	"time"
)

type DateTime time.Time

func (d DateTime) MarshalJSON() ([]byte, error) {
	// 重写time转换成json之后的格式
	var str = fmt.Sprintf("\"%s\"", time.Time(d).Format("2006-01-02T15:04:05"))
	return []byte(str), nil
}
func (d DateTime) UnmarshalJSON(data []byte) error {
	var err error
	var m time.Time
	m, err = time.Parse(`"2006-01-02 15:04:05"`, string(data))
	if err != nil {
		return err
	}
	d = DateTime(m)
	return nil
}

然后原本使用 time.Time的属性修改为types.DateTime

type User struct {
	Id         uint64              `json:"id"`
	Username   string              `json:"username"`
	Password   string              `json:"password"`
	CreateTime types.DateTime      `json:"createTime"`
}

那么接口端对 types.DateTime 类型的 JSON 输出就是指定格式的日期和时间了。

使用时间戳代替 time.Time 类型

数据库字段使用timestamp类型,go 结构体属性使用uint64类型。