Golang 自定义时间结构体支持Json&Gorm
package main
import (
"encoding/json"
"fmt"
"gorm.io/gorm"
"time"
)
// 定义自定义时间类型
type CustomTime struct {
time.Time
}
// 实现json.Marshaler接口以支持JSON序列化
func (ct CustomTime) MarshalJSON() ([]byte, error) {
return json.Marshal(ct.Format("2006-01-02 15:04:05"))
}
// 实现json.Unmarshaler接口以支持JSON反序列化
func (ct *CustomTime) UnmarshalJSON(data []byte) error {
t, err := time.Parse("2006-01-02 15:04:05", string(data))
if err != nil {
return err
}
ct.Time = t
return nil
}
// 实现GormValuer接口以支持Gorm存储
func (ct CustomTime) GormValue(ctx context.Context, db *gorm.DB) (interface{}, error) {
return ct.Time, nil
}
// 实现GormScanner接口以支持Gorm读取数据库
func (ct *CustomTime) Scan(value interface{}) error {
switch v := value.(type) {
case time.Time:
ct.Time = v
return nil
case nil:
ct.Time = time.Time{}
return nil
default:
return fmt.Errorf("unsupported scan type for CustomTime: %T", value)
}
}
func main() {
// 示例:序列化和反序列化
now := CustomTime{time.Now()}
serialized, _ := json.Marshal(now)
fmt.Println(string(serialized)) // 输出类似 "2023-04-05 12:34:56"
var deserialized CustomTime
json.Unmarshal(serialized, &deserialized)
fmt.Println(deserialized.Format("2006-01-02 15:04:05")) // 输出 "2023-04-05 12:34:56"
// 示例:Gorm存储和读取
// 假设有一个Gorm模型使用CustomTime
type Model struct {
ID uint
CreatedAt CustomTime
}
// 使用Gorm时,CustomTime会自动被识别和处理
}
这段代码定义了一个CustomTime
结构体,它包含了time.Time
作为嵌入字段。它实现了json.Marshaler
和json.Unmarshaler
接口以支持JSON序列化和反序列化,同时实现了gorm.io/gorm
包中的GormValuer
和GormScanner
接口以支持Gorm ORM的存储和读取。这样,CustomTime
可以在JSON和Gorm之间无缝集成,方便进行时间数据的处理。
评论已关闭