首页 > 后端开发 > Golang > 正文

在 Go 中解组 sql.NullTime 结构

PHPz
发布: 2024-02-09 14:42:09
转载
1369人浏览过

在 go 中解组 sql.nulltime 结构

php小编小新在Go语言中,我们经常会使用sql.NullTime结构来处理数据库中的时间字段。NullTime结构可以表示一个可空的时间值,非常适用于处理数据库中的空值。在本文中,我们将介绍如何解组sql.NullTime结构,以及如何正确处理其中可能存在的空值情况。无论您是初学者还是有一定经验的开发者,本文都将为您提供清晰的指导,帮助您更好地理解和使用NullTime结构。

问题内容

给定

type NullTime struct {
    Time  time.Time
    Valid bool // Valid is true if Time is not NULL
}
登录后复制

type PayinCount struct {
    DateShiftStart sql.NullTime    `json:"dateShiftStart"`
    DateShiftEnd   sql.NullTime    `json:"dateShiftend"`
}
登录后复制

当我处理以下 JSON 时

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
登录后复制

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
登录后复制

其中 sendErrorResponse 是以下辅助进程

func sendErrorResponse(w http.ResponseWriter, err string, statusCode int) {
    messageStatusCode := MessageStatusCode{
        Message:    err,
        StatusCode: statusCode}
    w.WriteHeader(statusCode)
    json.NewEncoder(w).Encode(messageStatusCode)
}
登录后复制

我收到以下消息

{
    "message": "json: cannot unmarshal string into Go struct field PayinsCount.dateShiftStart of type sql.NullTime",
    "statusCode": 400
}
登录后复制

如何解决这个问题?

PHP5 和 MySQL 圣经
PHP5 和 MySQL 圣经

本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。

PHP5 和 MySQL 圣经 466
查看详情 PHP5 和 MySQL 圣经

解决方法

我最终使用了以下内容。 我添加了以下类型。

type NullDate sql.NullTime
登录后复制

然后我将 PayinsCount 更改为使用 NullDate

type PayinsCount struct {
    DateShiftStart NullDate      `json:"dateShiftStart,omitempty"`
    DateShiftEnd   NullDate      `json:"dateShiftend,omitempty"`
}
登录后复制

然后我创建了

// UnmarshalJSON for NullDate
func (nd *NullDate) UnmarshalJSON(b []byte) error {
    s := string(b)
    s = strings.ReplaceAll(s, "\"", "")

    x, err := time.Parse(time.DateOnly, s)
    if err != nil {
        nd.Valid = false
        return err
    }

    nd.Time = x
    nd.Valid = true
    return nil
}
登录后复制

现在当我处理以下 JSON 时

{
    "dateShiftStart":"2023-10-16",
    "dateShiftEnd":"2023-10-23"
}
登录后复制

var payinsCount PayinsCount
err = json.Unmarshal(body, &payinsCount)
if err != nil {
    sendErrorResponse(w, err.Error(), http.StatusBadRequest)
    return
}
登录后复制

它有效。我最终得到了一个有效的 PayinsCount 实例。

为了完整起见,这里是 NullDate 的 MarshalJSON 函数

// MarshalJSON for NullDate
func (nd NullDate) MarshalJSON() ([]byte, error) {
    if !nd.Valid {
        return []byte("null"), nil
    }
    val := fmt.Sprintf("\"%s\"", nd.Time.Format(time.DateOnly))
    return []byte(val), nil
}
登录后复制

注意转义的双引号 - 如果没有它们,encoding/json 编组代码将以 3 个块的形式处理日期字符串,并且我收到以下错误

error(*encoding/json.SyntaxError) *{msg: "invalid character '-' after top-level value", Offset: 0}
登录后复制

以上就是在 Go 中解组 sql.NullTime 结构的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号