zoukankan      html  css  js  c++  java
  • 使用指针解决golang 零值序列化问题

    很多时候我们基于golang编写数据库操作的时候需要进行零值的处理,一般我们的数据操作都是基于orm 以及tag处理的
    所以零值就是一个比较费事的事情了,如果业务对于零值有关联操作那么我们就需要处理,如果不关联就不处理。
    如果了解aws golang 的sdk 的化,处理的就比较好,全部通过指针操作,同时也包装了一个通用包,以下是一个简单的
    demo说明

    参考代码

    • main.go
     
    package main
    import (
        "encoding/json"
        "log"
    )
    type user struct {
        Name string `json:"name"`
        Age  int    `json:"age,omitempty"`
    }
    type user2 struct {
        Name string `json:"name"`
        Age  *int   `json:"age,omitempty"`
    }
    // Int int point helper
    func Int(value int) *int {
        return &value
    }
    func main() {
        user0 := user{
            Name: "dalong",
            Age:  0,
        }
        user1 := user{
            Name: "dalong",
            Age:  0,
        }
        user2 := user2{
            Age: Int(0),
        }
        info, err := json.Marshal(user0)
        info1, err := json.Marshal(user1)
        info2, err := json.Marshal(user2)
        if err != nil {
            log.Println(err)
        } else {
            log.Println(string(info), string(info1), string(info2))
        }
    }
    • 代码说明
      user struct 使用了值传递,而且age 为int 为空忽略,所以零值也就有问题了,user2 通过指针处理,所以没问题
      同时为了方便处理指针包装了一个Int 函数,可以返回指针数据
    • 运行效果
     
    2020/07/26 10:32:43 {"name":"dalong"} {"name":"dalong"} {"name":"","age":0}

    说明

    当然如果关注过sql 数据包装的化,为发现sql 也提供了类似的数据包装,实际上就是不同模型的适配处理,同时基于新的数据类型
    做了包装

    参考资料

    https://github.com/aws/aws-sdk-go/blob/master/aws/convert_types.go

  • 相关阅读:
    (五) 子类与继承
    linux7(centos7)新系统安装后要做的事!
    CentOS7系统搭建FTP服务器
    ---Docker学习随笔---基础管理部分---
    linux系统配置本地yum源
    安装redis 6.0.6
    LNMP部署
    如何在RHEL7或CentOS 7系统下修改网卡名称(亲测有效~!)
    Mysql常用基础命令操作
    MySQL版本浅介
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13379527.html
Copyright © 2011-2022 走看看