Go之底层利器-AST遍历

2018-11-27 23:08:12

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

go run undefined

2018-03-24 10:24:53

问题现象: 同一个文件夹下面有多个go文件,a.go,b.go,c.go,其中main在a.go中,直接go run a.go,报undefined 错误 原因: go在run之前会先进行编译操作,而在此处的编译它只会以这个a.go为准,导致其他几个引用文件中的方法出现找不到的情况 (而采用go build的方式又不一样,他会自动查找引用文件并打包) 解决方法: go run a.go b.go c.go 或 go run *.go

golang之uint8、int8与byte的区别

2018-01-24 10:30:38

简单说明 uint8与byte可以说是一样的,因为文档中有这样的定义: The Go Programming Language Specification Numeric types uint8 the set of all unsigned 8-bit integers (0 to 255) byte alias for uint8 也就是说,我们在需要将这两种类型转换为string的时候都是可以直接使用string()来进行的。 而int8的取值范围为-128~127,所以int8不能直接与uint8、byte进行直接转换。 举例 注:部分来源于网上 uint8&&byte package main import ( "fmt" ) func ByteSlice(b []byte) []byte