go json编译原理XJSON实现四则运算

目录
  • 前言
    • 转义字符
    • 性能优化
  • 实现四则运算
  • 总结

前言

在上一篇中介绍了xjson的功能特性以及使用查询语法快速方便的获取JSON中的值。

同时这次也更新了一个版本,主要是两个升级:

  • 对转义字符的支持。
  • 性能优化,大约提升了30%️。

转义字符

先说第一个转义字符,不管是原始JSON字符串中存在转义字符,还是查询语法中存在转义字符都已经支持,具体用法如下:

str = `{"1a.b.[]":"b"}`
    get = Get(str, "1a\\.b\\.\\[\\]")
    assert.Equal(t, get.String(), "b")
    str = `{".":"b"}`
    get = Get(str, "\\.")
    assert.Equal(t, get.String(), "b")
    str = `{"a":"{\"a\":\"123\"}"}`
    get = Get(str, "a")
    fmt.Println(get)
    assert.Equal(t, get.String(), "{\"a\":\"123\"}")
    assert.Equal(t, Get(get.String(), "a").String(), "123")
    str = `{"a":"{\"a\":[1,2]}"}`
    get = Get(str, "a")
    fmt.Println(get)
    assert.Equal(t, get.String(), "{\"a\":[1,2]}")
    assert.Equal(t, Get(get.String(), "a[0]").Int(), 1)

性能优化

性能也有部分优化,大约比上一版本提升了 30%。

pkg: github.com/crossoverJie/xjson/benckmark
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkDecode-12               14968         77130 ns/op       44959 B/op        1546 allocs/op
PASS
------------------------------------
pkg: github.com/crossoverJie/xjson/benckmark
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkDecode-12               19136         62960 ns/op       41593 B/op        1407 allocs/op
PASS

但总体来说还有不少优化空间,主要是上限毕竟低,和官方库比还是有不小的差距。

实现四则运算

接下来聊聊四则运算是如何实现的,这本身算是一个比较有意思的feature,虽然用的场景不多

(0)

相关推荐

  • Golang栈结构和后缀表达式实现计算器示例

    目录 引言 问题 中缀.后缀表达式的计算 人利用中缀表达式计算值 计算机利用后缀表达式计算值 计算后缀表达式的代码实现 中缀表达式转后缀表达式 转换过程 转换的代码实现 总结 引言 只进行基本的四则运算,利用栈结构和后缀表达式来计算数学表达式的值. 本文代码:GitHub 运行效果: 问题 如果只能进行两个值的加减乘除,如何编程计算一个数学表达式的值? 比如计算 1+2*3+(4*5+6)*7,我们知道优先级顺序 () 大于 * / 大于 + - ,直接计算得 1+6+26*7 = 189 中缀

  • go面向对象方式操作JSON库实现四则运算

    目录 前言 面向对象的方式操作 JSON 实现原理 对 JSON 做四则运算 总结 前言 在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct:如果想要获取值就需要先做断言将其转换为 map 或者是切片再来获,会比较麻烦. decode, err := xjson.Decode(`{"glossary":{"title":"example glossary"

  • golang 四则运算计算器yacc归约手写实现

    目录 缘起 目标 难点 总体流程 main.go tokens/tokens.go states/states.go lexer/lexer.go parser/tStackNode.go parser/parser.go 输出 缘起 最近拜读前桥和弥[日]的<<自制编程语言>> 开头一章便是教读者使用lex/yacc工具 制作四则运算器 其中yacc的移进/归约/梯度下降的思想很有启发 于是使用golang练习之 目标 制作一个四则运算器, 从os.Stdin读入一行表达式, 然

  • go json编译原理XJSON实现四则运算

    目录 前言 转义字符 性能优化 实现四则运算 总结 前言 在上一篇中介绍了xjson的功能特性以及使用查询语法快速方便的获取JSON中的值. 同时这次也更新了一个版本,主要是两个升级: 对转义字符的支持. 性能优化,大约提升了30%️. 转义字符 先说第一个转义字符,不管是原始JSON字符串中存在转义字符,还是查询语法中存在转义字符都已经支持,具体用法如下: str = `{"1a.b.[]":"b"}` get = Get(str, "1a\\.b\\.

  • 深入了解Vue3模板编译原理

    目录 Parse Transform cacheHandlers hoistStatic prefixIdentifiers PatchFlags hoists type 变化 Codegen 代码生成模式 静态节点 帮助函数 helpers helpers 是怎么使用的呢? 如何生成代码? Vue 的编译模块包含 4 个目录: compiler-core compiler-dom // 浏览器 compiler-sfc // 单文件组件 compiler-ssr // 服务端渲染 其中 com

  • 浅谈Sizzle的“编译原理”

    Sizzle,是jQuery作者John Resig写的DOM选择器引擎,速度号称业界第一.作为一个独立全新的选择器引擎,出现在jQuery 1.3版本之后,并被John Resig作为一个开源的项目.Sizzle是独立的一部分,不依赖任何库,如果你不想用jQuery,可以只用Sizzle,也可以用于其他框架如:Mool, Dojo,YUI等. 前几天在准备一个关于jQuery的分享PPT,问同事关于jQuery除了使用方法之外还有没有其他特别想了解一下的,有人提到了想了解下它的选择器是怎么实现

  • JavaScript 详解预编译原理

    JavaScript 预编译原理 今天用了大量时间复习了作用域.预编译等等知识 看了很多博文,翻开了以前看过的书(好像好多书都不会讲预编译) 发现当初觉得自己学的很明白,其实还是存在一些思维误区 (很多博文具有误导性) 今晚就整理了一下凌乱的思路 先整理一下预编译的知识吧,日后有时间再把作用域详细讲解一下 大家要明白,这个预编译和传统的编译是不一样的(可以理解js预编译为特殊的编译过程) JavaScript是解释型语言, 既然是解释型语言,就是编译一行,执行一行 传统的编译会经历很多步骤,分词

  • 详解编译器编译原理

    详解编译器编译原理 什么是gcc  什么是gcc:gcc是GNU Compiler Collection的缩写.最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C.C++.Java.Pascal.Ada.COBOL语言等. gcc支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持 gcc主要特征  1)gcc是一个可移植的编译器,支持多种硬件平台 2)gcc不仅仅是个本地编译器,它还能跨平台交叉编译. 3)gcc

  • C++编译原理之求解First集合

    目录 1.上机要求 2.原理 3.一点思路及优化 4.代码 4.1 lan.txt文件内容 4.2 lan.txt文件内容 1.上机要求 目的:熟练掌握自上而下的语法分析方法,并能用程序实现. 要求: 例如,使用的文法如下: 编写First函数,实现其求解过程. E -> TE' E' -> +TE' | # T -> FT' T' -> *FT' | # F -> (E) | id end 提示: 非终结符为 大写字母:或 后面带'的大写字母 终结符为 小写字母和符号(+.

  • Go语言编译原理之源码调试

    目录 前言 Goland的debug调试Go源码 dlv工具调试Go源码 安装 常用命令 dlv调试抽象语法树构建 前言 在前边几篇文章中分享了Go编译过程中的源码实现,本文主要是想分享一下我是怎么调试Go的源代码的(如果你很熟悉的话,可以跳过本文).本文主要是分享两种Go源码的调试方法 Goland的debug dlv工具 本文我还会以抽象语法树为例,来通过dlv对它的构建过程进行调试 Goland的debug调试Go源码 下边以调试Go编译的入口文件为例 编辑debug配置 填写配置信息 打

  • Go语言编译原理之变量捕获

    目录 前言 变量捕获概述 变量捕获底层实现 总结 前言 在前边的几篇文章中已经基本分享完了编译器前端的一些工作,后边的几篇主要是关于编译器对抽象语法树进行分析和重构,然后完成一系列的优化,其中包括以下五个部分: 变量捕获 函数内联 逃逸分析 闭包重写 遍历函数 后边的五篇文章主要就是上边这五个主题,本文分享的是变量捕获,变量捕获主要是针对闭包场景的,因为闭包函数中可能引用闭包外的变量,因此变量捕获需要明确在闭包中通过值引用或地址引用的方式来捕获变量 变量捕获概述 下边通过一个示例来看一下什么是变

  • Go编译原理之函数内联

    目录 前言 函数内联概述 函数内联底层实现 visitBottomUp caninl inlcalls 前言 在前一篇文章中分享了编译器优化的变量捕获部分,本文分享编译器优化的另一个内容—函数内联.函数内联是指将将较小的函数内容,直接放入到调用者函数中,从而减少函数调用的开销 函数内联概述 我们知道每一个高级编程语言的函数调用,成本都是在与需要为它分配栈内存来存储参数.返回值.局部变量等等,Go的函数调用的成本在于参数与返回值栈复制.较小的栈寄存器开销以及函数序言部分的检查栈扩容(Go语言中的栈

  • JS声明变量背后的编译原理剖析

    只要是写过点JS代码,很简单一个var 就完事了.那对于JS编译器背后它又发生了什么呢?那就一步步通过代码来讲起. 复制代码 代码如下: x = 1; alert(x); var y = function() { alert(x); var x = 2; alert(x); } y(); 上面的代码也会你答对了它会分别输出:1,undefined,2.对于我来说,第一反应它会输出:1,1,2.为什么第二个会输出undefined?在上面我明确定义了一个全局变量x,为何找不到? 那是因为:js编译

随机推荐