Go easyjson使用及反射原理

目录
  • 安装easyjson
  • 使用easyjson
  • 使用示例

如果使用go语言自带的json库,使用的是反射,而go语言中反射性能较低。easyjson就是一个比较好的替代方案。

esayjson安装(https://gitcode.net/mirrors/mailru/easyjson?utm_source=csdn_github_accelerator)

go get -u github.com/mailru/easyjson
go install  github.com/mailru/easyjson/easyjsonorgo
go build -o easyjson github.com/mailru/easyjson/easyjson(这里默认在当前目录生成easyjson二进制可执行文件)

安装easyjson

# for Go < 1.17
go get -u github.com/mailru/easyjson/...

# for Go >= 1.17
go get github.com/mailru/easyjson && go install github.com/mailru/easyjson/...@latest

说下我的环境:win10,go1.18,如下图

安装完毕后,GOPATH里bin下就有easyjson.exe。

使用go env 查看如我的gopath为:C:\Users\77293\go

使用easyjson

go mod init demo

比如我的当前工作目录demo下初始化mod,创建一个文件夹model,在model下新建student.go文件:

定义结构体:

记得在需要使用easyjson的结构体上加上//model:json 标注。 此处model是我的包路径名即为model,代码如下:

package model
import "time"
//model:json
type School struct {
    Name string `json:"name"`
    Addr string `json:"addr"`
}
type Student struct {
    Id       int       `json:"id"`
    Name     string    `json:"s_name"`
    School   School    `json:"s_chool"`
    Birthday time.Time `json:"birthday"`

可以进入结构体包model下执行:

easyjson -all student.go

运行完后,该文件夹中有一个student_easyjson.go,该文件中就是easyjson帮我们生成的MarshalJSON和UnmarshalJSON方法. 

使用示例

package main

import (
    "demo/model"
    "fmt"
    "time"
)
func main() {
    s := model.Student{
        Id:   11,
        Name: "qq",
        School: model.School{
            Name: "CUMT",
            Addr: "xz",
        },
        Birthday: time.Now(),
    }
    bt, err := s.MarshalJSON() // MarshalJSON
    fmt.Println(string(bt), err)
    json := `{"id":1,"s_name":"克莱尔","s_chool":{"name":"中南","addr":"wuhan"},"birthday":"2003-08-04T20:58:07.9894603+08:00"}`
    str := model.Student{}
    str.UnmarshalJSON([]byte(json)) // UnmarshalJSON
    fmt.Println(str)
}

运行结果:

{"id":11,"s_name":"qq","s_chool":{"name":"CUMT","addr":"xz"},"birthday":"2022-04-17T20:48:07.9274949+08:00"} <nil>
{1 克莱尔 {中南 wuhan} 2003-08-04 20:58:07.9894603 +0800 CST

小结:go自带JSON库使用的反射原理,性能相对较差,可以使用easyjson代替。

到此这篇关于Go easyjson使用技巧的文章就介绍到这了,更多相关Go easyjson使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在Go中使用JSON(附demo)

    目录 Go编码/json包 编码.将Go对象转换为JSON 什么是Go中的marshaling? 装载简单对象 对复杂对象进行编码 集合功能 重命名字段 生成具有缩进功能的JSON(pretty-print) 忽略JSON输出中的特定字段 解除伪装.将JSON转换为Go对象 解除对简单JSON结构的封存 解除复杂数据结构的束缚 从文件系统中读取JSON文件 将JSON文件写到文件系统中 自定义抓取和解除抓取 自定义编排 自定义解密 总结 Golang(又称Go)是一种静态类型的编译编程语言,具有

  • go语言通过结构体生成json示例解析

    目录 通过结构体生成json 通过map生成json json解析到结构体 json解析到map 通过结构体生成json buf, err := json.MarshalIndent(s, "", " ") //格式化编码 package main import ( "encoding/json" "fmt" ) //成员变量名首字母必须大写 type IT struct { Company string `json:&quo

  • Go处理json数据方法详解(Marshal,UnMarshal)

    json数据格式 参见json数据格式说明. 如果没操作过json数据,建议先看下上面的文章,有助于理解本文后面的内容. Go json包 Marshal():Go数据对象 -> json数据UnMarshal():Json数据 -> Go数据对象 func Marshal(v interface{}) ([]byte, error) func Unmarshal(data []byte, v interface{}) error 构建json数据 Marshal()和MarshalInden

  • GoLang中Json Tag用法实例总结

    目录 前言 Json中Tag用法汇总 官方 Marshal 函数说明 参考 总结 前言 GoLang中结构体的 JSON Tag 标识(英文名backquote或backtick,反引号 ` 符号包裹的部分内容)一直未明确看过完整规范和使用说明,存在模棱两可,系统整理如下: JSON Tag标签的完整语法,包含哪些选项 不同选项(输出名/-/omitempty/string)的作用及使用范围 特殊注意事项补充 Json中Tag用法汇总 JSON Tag标签格式为:json:"FieldName/

  • Go easyjson使用及反射原理

    目录 安装easyjson 使用easyjson 使用示例 如果使用go语言自带的json库,使用的是反射,而go语言中反射性能较低.easyjson就是一个比较好的替代方案. esayjson安装(https://gitcode.net/mirrors/mailru/easyjson?utm_source=csdn_github_accelerator) go get -u github.com/mailru/easyjson go install github.com/mailru/easy

  • java反射原理制作对象打印工具

    主要运用java反射原理,格式化输出java对象属性值,特别是list 和map. MyTestUtil.java package utils; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.Iterator; import

  • PHP反射原理与用法深入分析

    本文实例讲述了PHP反射原理与用法.分享给大家供大家参考,具体如下: 说到反射,实际上包含两个概念: 检视 introspection 判断类.方法是否存在,父子类关系,调用关系等,检视的函数文档 反射 Reflection 获取类里的方法.属性,注释等,反射类的文档 PHP官方文档写得很清晰了,下面我就说一下具体的应用. 1.参数检测 有时候需要在函数里需要判断传入的参数类型是否合法. 这时可以使用is_a.is_subclass_of来检测.或者结合反射,做更多检测. 2.动态调用 在依赖注

  • Java基础之反射原理与用法详解

    本文实例讲述了Java基础之反射原理与用法.分享给大家供大家参考,具体如下: 1.什么是反射? 反射其实就是动态的加载类,我们在写JDBC的时候加载驱动Class.forName("xxx")时就涉及到了反射. 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射机制能做什么? 1. 在运行时判断任意一个对象的所属的类Class.

  • Java泛型机制与反射原理相关知识总结

    一.泛型的概念 1.1 基础案例 泛型在Java中的应用非常广泛,最常见则是在集合容器中,先看下基础用法: public class Generic01 { public static void main(String[] args) { Map<Integer,String> map = new HashMap<>() ; map.put(88,"hello") ; // map.put("99","world") ;

  • Go reflect 反射原理示例详解

    目录 开始之前 分析 从何处获取类型信息 如何实现赋值操作? 总结 开始之前 在开始分析原理之前,有必要问一下自己一个问题: 反射是什么?以及其作用是什么? 不论在哪种语言中,我们所提到的反射功能,均指开发者可以在运行时通过调用反射库来获取到来获取到指定对象类型信息,通常类型信息中会包含对象的字段/方法等信息.并且,反射库通常会提供方法的调用, 以及字段赋值等功能. 使用反射可以帮助我们避免写大量重复的代码, 因此反射功能常见用于ORM框架, 以及序列化何反序列化框架,除此之外在Java中反射还

  • Java注解与反射原理说明

    一 点睛 注解若想发挥更大作用,还需借助反射机制之力.通过反射,可以取得一个方法上声明的注解的全部内容. 一般有两种需求: 1 取得方法中全部的注解,通过调用getAnnotations来实现. 2 判断操作是否是指定注解,通过调用getAnnotation来实现. 下面从源码角度来说明怎样获取这些注解信息. 二 源码导读--取得方法中全部的注解 public class AccessibleObject implements AnnotatedElement { ... //取得全部Annot

  • python面向对象 反射原理解析

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑

  • Python自省及反射原理实例详解

    Python中的自省与反射 由于Python是一门强类型的动态解释型语言,故我们在某些时候并不会知道(特别是与别人对接开发工作的时候)对象中具有的属性与方法. 这个时候我们并不能直接通过 .或者查看底层的 __dict__ 方法来获得该对象下的属性与方法,我们需要使用一种更文明的方式来获取该对象下的属性与方法,故这种文明的方式被称之为反射. 自省和反射是两个比较专业化的术语,首先自省是获取对象的能力,而反射是操纵对象的能力. Python中使用delattr()和setattr()实现反射,而其

  • 简单通用JDBC辅助类封装(实例)

    哎,最近很好久没写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernate 里面的SimpleJdbcTemplate,这里我想到了在大学的时候自己用过的一个简单的jdbc封装,现在我将代码贴出来,和大家一起分享: Config类:读取同一包下的数据库连接配置文件,这样是为了更好的通用性考虑 package com.tly.dbutil; import java.io.IOException; import java.util.

随机推荐