0%

前言

在上一个版本实现的脚本解释器 GScript 中实现了基本的四则运算以及 AST 的生成。

当我准备再新增一个 % 取模的运算符时,会发现工作很繁琐而且几乎都是重复的;主要是两步:

  1. 需要在词法解析器中新增对 % 符号的支持。
  2. 在语法解析器遍历 AST 时对 % token 实现具体逻辑。

其中的词法解析和遍历 AST 完全是重复工作,所以我们可否能够简化这两步呢?

Read more »

前言

最近在持续优化之前编写的 JSON 解析库 xjson,主要是两个方面的优化。

第一个是支持将一个 JSONObject 对象输出为 JSON 字符串。

这点在上个版本中只是利用自带的 Print 函数打印数据:

1
2
3
4
5
6
7
8
func TestJson4(t *testing.T)  {
str := `{"people":{"name":{"first":"bob"}}}`
first := xjson.Get(str, "people.name.first")
assert.Equal(t, first.String(), "bob")
get := xjson.Get(str, "people")
fmt.Println(get.String())
//assert.Equal(t, get.String(),`{"name":{"first":"bob"}}`)
}

Output:

1
map[name:map[first:bob]]
Read more »

原文链接

在日常使用 Goland 时,团队收集了一些可以帮助我们专注于创造的同时减少重复工作的小技巧。
如果你是在 IDEA 中使用的 Go 插件,或者其他 IntelliJ 的产品,同样也有这些特性。

Read more »

前言

在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct;如果想要获取值就需要先做断言将其转换为 map 或者是切片再来获,会比较麻烦。

1
2
3
4
5
decode, err := xjson.Decode(`{"glossary":{"title":"example glossary","age":1}}`)
assert.Nil(t, err)
glossary := v["glossary"].(map[string]interface{})
assert.Equal(t, glossary["title"], "example glossary")
assert.Equal(t, glossary["age"], 1)

但其实转念一想,部分场景我们甚至我们只需要拿到 JSON 中的某个字段的值,这样还需要先声明一个 struct 会略显麻烦。

经过查询发现已经有了一个类似的库来解决该问题,https://github.com/tidwall/xjson 并且 star 数还很多(甚至名字都是一样的😂),说明这样的需求大家还是很强烈的。

于是我也打算增加类似的功能,使用方式如下:

Read more »

前言

之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来。

一次无意间看到有人提起 JSON 解析器,这类工具充斥着我们的日常开发,运用非常广泛。

以前我也有思考过它是如何实现的,过程中一旦和编译原理扯上关系就不由自主的劝退了;但经过这段时间的实践我发现实现一个 JSON 解析器似乎也不困难,只是运用到了编译原理前端的部分知识就完全足够了。

得益于 JSON 的轻量级,同时语法也很简单,所以核心代码大概只用了 800 行便实现了一个语法完善的 JSON 解析器。

Read more »

背景

前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL;通常情况下是没有这个需求的;毕竟都用了 SpringCloud 的了,那服务之间的调用都是走注册中心的,不会需要自定义 URL 的情况。

Read more »