非常教程

Go参考手册

go

go/parser

  • import "go/parser"
  • 概述
  • 索引
  • 示例

概述

Package parser 为 Go 源文件实现解析器。输入可以以各种形式提供(参见各种 Parse *functions); 输出是表示 Go 源的抽象语法树(AST)。解析器是通过一个 Parse *functions 调用的。

解析器接受比 Go 规范在语法上允许的语言更大的语言,以简化语法错误​​,并提高语法错误的健壮性。例如,在方法声明中,接收器被看作是一个普通的参数列表,因此可能包含多个条目,其中规范只允许一个。因此,AST(ast.FuncDecl.Recv) 字段中的对应字段不限于一个条目。

索引

  • func ParseDir(fset *token.FileSet, path string, filter func(os.FileInfo) bool, mode Mode) (pkgs map[string]*ast.Package, first error)
  • func ParseExpr(x string) (ast.Expr, error)
  • func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (ast.Expr, error)
  • func ParseFile(fset *token.FileSet, filename string, src interface{}, mode Mode) (f *ast.File, err error)
  • type Mode

示例

ParseFile

包文件

interface.go parser.go

func ParseDir(显示源代码)

func ParseDir(fset *token.FileSet, path string, filter func(os.FileInfo) bool, mode Mode) (pkgs map[string]*ast.Package, first error)

ParseDir 针对 path 指定的目录中名称以“.go”结尾的所有文件调用ParseFile,并返回 package name -> package AST 与所有找到的包。

如果filter!= nil,则只考虑 os.FileInfo 条目通过过滤器(以“.go”结尾)的文件。模式位不变地传递给 ParseFile。位置信息记录在 fset 中,不能为零。

如果无法读取目录,则返回零映射和相应的错误。如果发生分析错误,则返回一个非零但不完整的映射和遇到的第一个错误。

func ParseExpr(显示源代码)

func ParseExpr(x string) (ast.Expr, error)

ParseExpr 是获取表达式 x 的 AST 的便捷函数。记录在 AST 中的位置信息是未定义的。错误消息中使用的文件名是空字符串。

func ParseExprFrom(显示源代码)

func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (ast.Expr, error)

ParseExprFrom 是一个用于解析表达式的便捷函数。参数的含义与 ParseFile 相同,但源必须是有效的 Go(类型或值)表达式。具体而言,fset 不能为零。

func ParseFile(显示源代码)

func ParseFile(fset *token.FileSet, filename string, src interface{}, mode Mode) (f *ast.File, err error)

ParseFile 解析单个 Go 源文件的源代码并返回相应的 ast.File 节点。源代码可以通过源文件的文件名或通过 src 参数提供。

如果src!= nil,ParseFile 解析来自 src 的源文件并且文件名仅在记录位置信息时使用。src 参数的参数类型必须是 string,[]byte 或 io.Reader。如果 src == nil,ParseFile 解析由 filename 指定的文件。

mode 参数控制解析的源文本的数量和其他可选的解析器功能。位置信息记录在文件集 fset 中,该文件集不能为零。

如果源无法读取,则返回的 AST 为零,并且错误指示特定故障。如果源被读取但发现语法错误,则结果是部分 AST(ast.Bad* nodes 代表错误源代码的​​片段)。多个错误通过一个 scanner.ErrorList 按文件位置排序返回。

示例

package main

import (
	"fmt"
	"go/parser"
	"go/token"
)

func main() {
	fset := token.NewFileSet() // 相对于fset的position
	src := `package foo

import (
	"fmt"
	"time"
)

func bar() {
	fmt.Println(time.Now())
}`

	// 解析src但在处理导入后停止。
	f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly)
	if err != nil {
		fmt.Println(err)
		return
	}

	// 从文件CAST打印导入。
	for _, s := range f.Imports {
		fmt.Println(s.Path.Value)
	}

}

type Mode(显示源代码)

Mode 值是一组标志(或0)。它们控制解析的源代码量和其他可选的解析器功能。

type Mode uint
const (
        PackageClauseOnly Mode             = 1 << iota // 在package子句之后停止解析
        ImportsOnly                                    // 导入声明后停止解析
        ParseComments                                  // 解析注释并将它们添加到AST
        Trace                                          // 打印一系列已解析的作品
        DeclarationErrors                              // 报告声明错误
        SpuriousErrors                                 // 与AllErrors相同,以实现向后兼容性
        AllErrors         = SpuriousErrors             // 报告所有错误(不仅仅是不同行上的前10个)
Go

Go 是一种编译型语言,它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性。它也打算成为现代的,支持网络与多核计算的语言。要满足这些目标,需要解决一些语言上的问题:一个富有表达能力但轻量级的类型系统,并发与垃圾回收机制,严格的依赖规范等等。这些无法通过库或工具解决好,因此Go也就应运而生了。

主页 https://golang.org/
源码 https://go.googlesource.com/go
发布版本 1.9.2

Go目录

1.档案 | archive
2.缓冲区 | bufio
3.内置 | builtin
4.字节 | bytes
5.压缩 | compress
6.容器 | container
7.上下文 | context
8.加密 | crypto
9.数据库 | database
10.调试 | debug
11.编码 | encoding
12.错误 | errors
13. expvar
14.flag
15. fmt
16. go
17.散列 | hash
18.html
19.图像 | image
20.索引 | index
21.io
22.日志 | log
23.数学 | math
24. math/big
25.math/bits
26.math/cmplx
27.math/rand
28.拟态 | mime
29.net
30.net/http
31. net/mail
32. net/rpc
33.net/smtp
34. net/textproto
35. net/url
36.os
37.路径 | path
38.插件 | plugin
39.反射 | reflect
40.正则表达式 | regexp
41.运行时 | runtime
42.排序算法 | sort
43.转换 | strconv
44.字符串 | strings
45.同步 | sync
46.系统调用 | syscall
47.测试 | testing
48.文本 | text
49.时间戳 | time
50.unicode
51.不安全性 | unsafe
52.Go 语言数据类型
53.Go 语言基础语法
54.Go 语言结构
55.Go 语言 select 语句
56.Go 语言 switch 语句
57.Go 语言 if 语句嵌套
58.Go 语言 if…else 语句
59.Go 语言 if 语句
60.Go 语言运算符
61.Go 语言常量
62.Go 语言函数闭包
63.Go 语言函数作为实参
64.Go 语言函数引用传递值
65.Go 语言函数值传递值
66.Go 语言函数
67.Go 语言 goto 语句
68.Go 语言 continue 语句
69.Go 语言 break 语句
70.Go 语言循环嵌套
71.Go 语言 for 循环
72.Go 语言结构体
73.Go 语言指针作为函数参数
74.Go 语言指向指针的指针
75.Go 语言指针数组
76.Go 语言指针
77.Go 语言向函数传递数组
78.Go 语言多维数组
79.Go 语言变量作用域
80.Go 语言函数方法
81.Go 错误处理
82.Go 语言接口
83.Go 语言类型转换
84.Go 语言递归函数
85.Go 语言Map(集合)
86.Go 语言范围(Range)
87.Go 语言切片(Slice)
88.Go 并发
89.Go fmt.Sprintf 格式化字符串