PingD

PingD

一个阶段一个目标,多冷静下来思考思考

Go之底层利器-AST遍历

背景最近需要基于AST来做一些自动化工具,遂也需要针对这个神兵利器进行一下了解研究。本篇文章也准备只是简单的讲解一下以下两个部分: 通过AST解析一个Go程序然后通过Go的标准库来对这个AST进行分析AST什么是AST,其实就是抽象语法树Abstract Syntax Tree的简称。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。之所以说语法是“抽象”的,是因为这里的语法并不会表示出真实语法中出现的每个细节。 主菜开胃提示语以下内容有点长,要不先去买点瓜子,边磕边看? 编译过程要讲解相关AST部分,先简单说一下我们知道的编译过程: 词法分析语法分析语义分析和中间代码产生编译器优化目标代码生成 而我们现在要利用的正是Google所为我们准备的一套非常友好的词法分析和语法分析工具链,有了它我们就可以造车了。代码示例在Golang官方文档中已经提供实例,本处就不把文档源码贴出来了,只放出部分用例 // This example shows what an AST looks like when

sh、bash和zsh区别

简介Shell是一种脚本语言,是用户使用Linux的桥梁,要让这些脚本语言run起来,就必须要有解释器来执行这些脚本。而sh、bash、zsh就是脚本解释器,习惯上把它们陈祚一种shell,我们常说有多少种shell,其实说的就是shell脚本解释器。 shBourne Shell,是一个早期的重要shell,1978年由史蒂夫·伯恩编写,并同Version 7 Unix一起发布。 bashBourne-Again Shell,是一个为GNU计划编写的Unix shell。1987年由布莱恩·福克斯创造。主要目标是与POSIX标准保持一致,同时兼顾对sh的兼容,是各种Linux发行版标准配置的Shell,在Linux系统上/bin/sh往往是指向/bin/bash的符号链接。 zsh也称为Z

Go json裁剪

背景项目中遇到一个使用场景:服务端要保存用户上传的json格式示例,但是服务端针对这个json格式示例有大小限制,比如1KB,超过这个大小后服务端就不能正常保存了。此时用户正好手里有个比较大(>1KB)的json示例,他要想将这个示例正常保存可以进行两种不同操作: 手动去裁剪这个json字符串;通过智能的方式自动将一些重复且不必要的数据删除掉,以达到json裁剪的目的显然,针对第一种方式不太明智,那我们如果采用第二种方式的话,又该怎么做呢? 操刀在Go里面,我们引用官方标准库encoding/json对json进行序列化和反序列化时用的最多的也是下面的两个方法: func Unmarshal(data []byte, v interface{}) errorfunc Marshal(v interface{}) ([]byte, error)注意里面的入参interface类型参数,第一个是将data里面数据反序列化到v中,

golang 判断interface是否为空nil

前言interface很好用,可以存取任意类型,但我们在使用这个值类型的时候我们往往又需要知道该interface是属于哪种类型的,以便正确使用这个值。比如,如果我们提前知道该interface为int,则都是这样使用: var a interface{} a = 5 fmt.Println(2*a.(int)) 而往往我们interface可能会存放多种不同类型的数据,为了健壮,在使用时我们需要判断interface里面存放的到底为何种类型的数据,以及这些数据是否为空?比如你引用了一个类型里面的空对象是很容易引发panic的。 我们通过什么方式判断interface是否为空呢?先明确一点:一个interface里面存在动态类型和动态值,只有当动态类型和动态值都为空时,该interface才为空(nil) 比如: package main import "fmt"

Go查看项目引用的包版本及当前最新的版本

有时候我们需要知道当前项目引用的外部pkg是否是最新的版本,而如果通过go.mod里面一个一个去看明显显得有一点点弱,此时我们可以采用go list这个命令,直接查看当前项目的引用版本以及最新的版本,命令如下: go list -u -m -f '{{if not .Indirect}}{{.}}{{end}}' all 执行后如下: ➜ go list -u -m -f '{{if not .Indirect}}{{.}}{{end}}' all git.